diff --git a/clock/.vs/MWS1/v16/.suo b/clock/.vs/MWS1/v16/.suo new file mode 100644 index 00000000..6faad716 Binary files /dev/null and b/clock/.vs/MWS1/v16/.suo differ diff --git a/clock/.vsconfig b/clock/.vsconfig new file mode 100644 index 00000000..1586a483 --- /dev/null +++ b/clock/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/clock/Assembly-CSharp.csproj b/clock/Assembly-CSharp.csproj new file mode 100644 index 00000000..fb41003a --- /dev/null +++ b/clock/Assembly-CSharp.csproj @@ -0,0 +1,634 @@ + + + + latest + + + Debug + AnyCPU + 10.0.20506 + 2.0 + + {85A82546-F5BD-2A08-CD58-6429C0B1BEE9} + Library + Properties + Assembly-CSharp + v4.7.1 + 512 + . + + + true + full + false + Temp\bin\Debug\ + DEBUG;TRACE;UNITY_2019_4_21;UNITY_2019_4;UNITY_2019;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_2019_4_OR_NEWER;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE;PLATFORM_STANDALONE_WIN;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;GFXDEVICE_WAITFOREVENT_MESSAGEPUMP;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_STANDARD_2_0;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER + prompt + 4 + 0169 + False + + + pdbonly + true + Temp\bin\Release\ + prompt + 4 + 0169 + False + + + true + true + false + false + false + + + {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Unity/VSTU + 4.9.1.0 + Game:1 + StandaloneWindows:5 + 2019.4.21f1 + + + + + + + C:\Program Files\Unity\Hub\Editor\2019.4.21f1\Editor\Data\Managed/UnityEngine/UnityEngine.dll + + + C:\Program Files\Unity\Hub\Editor\2019.4.21f1\Editor\Data\Managed/UnityEditor.dll + + + + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.AndroidJNIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.AnimationModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.AudioModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.DSPGraphModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.DirectorModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.GameCenterModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.GridModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.HotReloadModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.IMGUIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.InputModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.InputLegacyModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.LocalizationModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.PhysicsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.Physics2DModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.ProfilerModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.StreamingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.SubstanceModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.SubsystemsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.TLSModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.TextCoreModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.TilemapModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UIModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UIElementsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UNETModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UmbraModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityTestProtocolModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.VFXModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.VRModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.VehiclesModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.VideoModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.WindModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEngine/UnityEngine.XRModule.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/Managed/UnityEditor.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/ref/2.0.0/netstandard.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/Microsoft.Win32.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.AppContext.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Collections.Concurrent.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Collections.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Collections.NonGeneric.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Collections.Specialized.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ComponentModel.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ComponentModel.EventBasedAsync.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ComponentModel.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ComponentModel.TypeConverter.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Console.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Data.Common.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Contracts.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Debug.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.FileVersionInfo.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Process.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.StackTrace.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.TextWriterTraceListener.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Tools.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.TraceSource.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Diagnostics.Tracing.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Drawing.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Dynamic.Runtime.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Globalization.Calendars.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Globalization.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Globalization.Extensions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.Compression.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.Compression.ZipFile.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.FileSystem.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.FileSystem.DriveInfo.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.FileSystem.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.FileSystem.Watcher.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.IsolatedStorage.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.MemoryMappedFiles.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.Pipes.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.IO.UnmanagedMemoryStream.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Linq.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Linq.Expressions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Linq.Parallel.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Linq.Queryable.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Http.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.NameResolution.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.NetworkInformation.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Ping.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Requests.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Security.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.Sockets.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.WebHeaderCollection.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.WebSockets.Client.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Net.WebSockets.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ObjectModel.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Reflection.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Reflection.Extensions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Reflection.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Resources.Reader.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Resources.ResourceManager.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Resources.Writer.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.CompilerServices.VisualC.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Extensions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Handles.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.InteropServices.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.InteropServices.RuntimeInformation.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Numerics.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Serialization.Formatters.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Serialization.Json.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Serialization.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Runtime.Serialization.Xml.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Claims.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.Algorithms.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.Csp.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.Encoding.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.Primitives.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Cryptography.X509Certificates.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.Principal.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Security.SecureString.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Text.Encoding.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Text.Encoding.Extensions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Text.RegularExpressions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Overlapped.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Tasks.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Tasks.Parallel.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Thread.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.ThreadPool.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Threading.Timer.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.ValueTuple.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.ReaderWriter.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XDocument.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XmlDocument.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XmlSerializer.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XPath.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netstandard/System.Xml.XPath.XDocument.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/Extensions/2.0.0/System.Numerics.Vectors.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/Extensions/2.0.0/System.Runtime.InteropServices.WindowsRuntime.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/mscorlib.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.ComponentModel.Composition.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Core.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Data.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Drawing.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.IO.Compression.FileSystem.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Net.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Numerics.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Runtime.Serialization.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.ServiceModel.Web.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Transactions.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Web.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Windows.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Xml.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Xml.Linq.dll + + + C:/Program Files/Unity/Hub/Editor/2019.4.21f1/Editor/Data/NetStandard/compat/2.0.0/shims/netfx/System.Xml.Serialization.dll + + + E:/Unity/MWS1/Library/ScriptAssemblies/Unity.Timeline.Editor.dll + + + E:/Unity/MWS1/Library/ScriptAssemblies/Unity.VSCode.Editor.dll + + + E:/Unity/MWS1/Library/ScriptAssemblies/Unity.TextMeshPro.Editor.dll + + + E:/Unity/MWS1/Library/ScriptAssemblies/UnityEngine.UI.dll + + + E:/Unity/MWS1/Library/ScriptAssemblies/Unity.Timeline.dll + + + E:/Unity/MWS1/Library/ScriptAssemblies/Unity.CollabProxy.Editor.dll + + + E:/Unity/MWS1/Library/ScriptAssemblies/Unity.Rider.Editor.dll + + + E:/Unity/MWS1/Library/ScriptAssemblies/Unity.TextMeshPro.dll + + + E:/Unity/MWS1/Library/ScriptAssemblies/UnityEditor.UI.dll + + + + + + + \ No newline at end of file diff --git a/clock/Assets/Grass-025.jpg b/clock/Assets/Grass-025.jpg new file mode 100644 index 00000000..537a065d Binary files /dev/null and b/clock/Assets/Grass-025.jpg differ diff --git a/clock/Assets/Grass-025.jpg.meta b/clock/Assets/Grass-025.jpg.meta new file mode 100644 index 00000000..321f1ebb --- /dev/null +++ b/clock/Assets/Grass-025.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 5eb4e2d293941bb41b5ae5a74267ce68 +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: -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 + 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 + 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/clock/Assets/Gravel020_1K-JPG.meta b/clock/Assets/Gravel020_1K-JPG.meta new file mode 100644 index 00000000..901d6612 --- /dev/null +++ b/clock/Assets/Gravel020_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bfe5f31b84d982747adf4b14f5febd02 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..ad0097a0 Binary files /dev/null and b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..96465de0 --- /dev/null +++ b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: e63d497dba60bb349bb36bce5c0de052 +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: -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 + 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 + 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/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Color.jpg b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Color.jpg new file mode 100644 index 00000000..618b0892 Binary files /dev/null and b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Color.jpg differ diff --git a/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Color.jpg.meta b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Color.jpg.meta new file mode 100644 index 00000000..3b77d806 --- /dev/null +++ b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 385410defe6a7884a9c362955051be5c +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: -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 + 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 + 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/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg new file mode 100644 index 00000000..57f6fa7a Binary files /dev/null and b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg differ diff --git a/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg.meta b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg.meta new file mode 100644 index 00000000..b1974e41 --- /dev/null +++ b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 1382d98a997e2104cae031abf90c60dd +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: -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 + 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 + 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/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg new file mode 100644 index 00000000..e5ba8a14 Binary files /dev/null and b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg differ diff --git a/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg.meta b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg.meta new file mode 100644 index 00000000..a4e66c8f --- /dev/null +++ b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 8e03c6d0514d7fa47985c4004002fd38 +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: -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 + 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 + 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/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg new file mode 100644 index 00000000..c8308577 Binary files /dev/null and b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg differ diff --git a/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg.meta b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg.meta new file mode 100644 index 00000000..8c9dd744 --- /dev/null +++ b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 8348a0f81d4ebe84d973487c275905d7 +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: -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 + 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 + 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/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg new file mode 100644 index 00000000..dcbaf573 Binary files /dev/null and b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg differ diff --git a/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg.meta b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg.meta new file mode 100644 index 00000000..d15749c6 --- /dev/null +++ b/clock/Assets/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 5cd3b61135546454bbf599a70043f564 +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: -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 + 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 + 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/clock/Assets/Ground019_1K-JPG.meta b/clock/Assets/Ground019_1K-JPG.meta new file mode 100644 index 00000000..2fdd8f81 --- /dev/null +++ b/clock/Assets/Ground019_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 42fba0b084978d14a8f42aa26a251647 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg b/clock/Assets/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..b5bdadbb Binary files /dev/null and b/clock/Assets/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..acb4f8ab --- /dev/null +++ b/clock/Assets/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: f6ffd4c93fd006342bb9319e28768ec0 +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: -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 + 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 + 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/clock/Assets/Ground019_1K-JPG/Ground019_1K_Color.jpg b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Color.jpg new file mode 100644 index 00000000..a6ef317d Binary files /dev/null and b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Color.jpg differ diff --git a/clock/Assets/Ground019_1K-JPG/Ground019_1K_Color.jpg.meta b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Color.jpg.meta new file mode 100644 index 00000000..0ca5dff0 --- /dev/null +++ b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 0a6e5217152fd704d944f7b9f2c6136f +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: -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 + 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 + 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/clock/Assets/Ground019_1K-JPG/Ground019_1K_Displacement.jpg b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Displacement.jpg new file mode 100644 index 00000000..4f5c8bf5 Binary files /dev/null and b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Displacement.jpg differ diff --git a/clock/Assets/Ground019_1K-JPG/Ground019_1K_Displacement.jpg.meta b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Displacement.jpg.meta new file mode 100644 index 00000000..c559d804 --- /dev/null +++ b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: c4aa2f21f60369945b2cb2dfa5163341 +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: -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 + 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 + 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/clock/Assets/Ground019_1K-JPG/Ground019_1K_Normal.jpg b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Normal.jpg new file mode 100644 index 00000000..9f3c872d Binary files /dev/null and b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Normal.jpg differ diff --git a/clock/Assets/Ground019_1K-JPG/Ground019_1K_Normal.jpg.meta b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Normal.jpg.meta new file mode 100644 index 00000000..903f326b --- /dev/null +++ b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 79905d9fc4b1039459242aef73fa6ea1 +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: -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 + 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 + 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/clock/Assets/Ground019_1K-JPG/Ground019_1K_Roughness.jpg b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Roughness.jpg new file mode 100644 index 00000000..b04b4f69 Binary files /dev/null and b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Roughness.jpg differ diff --git a/clock/Assets/Ground019_1K-JPG/Ground019_1K_Roughness.jpg.meta b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Roughness.jpg.meta new file mode 100644 index 00000000..a80fae1e --- /dev/null +++ b/clock/Assets/Ground019_1K-JPG/Ground019_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: c627cf51ced11cf479037db89e1027e6 +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: -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 + 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 + 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/clock/Assets/Ground037_1K-JPG.meta b/clock/Assets/Ground037_1K-JPG.meta new file mode 100644 index 00000000..4db79635 --- /dev/null +++ b/clock/Assets/Ground037_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e3d7e34fc78ff748882a64c510be0c3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg b/clock/Assets/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..9f36e2ea Binary files /dev/null and b/clock/Assets/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..ce801b36 --- /dev/null +++ b/clock/Assets/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 68596bee8dba9354c931f83598dc7505 +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: -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 + 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 + 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/clock/Assets/Ground037_1K-JPG/Ground037_1K_Color.jpg b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Color.jpg new file mode 100644 index 00000000..b388450a Binary files /dev/null and b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Color.jpg differ diff --git a/clock/Assets/Ground037_1K-JPG/Ground037_1K_Color.jpg.meta b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Color.jpg.meta new file mode 100644 index 00000000..4d9881aa --- /dev/null +++ b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: cb24306a45513d04685acfb4b7eca86c +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: -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 + 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 + 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/clock/Assets/Ground037_1K-JPG/Ground037_1K_Displacement.jpg b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Displacement.jpg new file mode 100644 index 00000000..312346ac Binary files /dev/null and b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Displacement.jpg differ diff --git a/clock/Assets/Ground037_1K-JPG/Ground037_1K_Displacement.jpg.meta b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Displacement.jpg.meta new file mode 100644 index 00000000..ca09d723 --- /dev/null +++ b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 44dae08f01549a8429588dbb118d661d +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: -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 + 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 + 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/clock/Assets/Ground037_1K-JPG/Ground037_1K_Normal.jpg b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Normal.jpg new file mode 100644 index 00000000..7f694af6 Binary files /dev/null and b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Normal.jpg differ diff --git a/clock/Assets/Ground037_1K-JPG/Ground037_1K_Normal.jpg.meta b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Normal.jpg.meta new file mode 100644 index 00000000..12c981ea --- /dev/null +++ b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 7f99924108c57b840af3bdba354cf886 +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: -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 + 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 + 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/clock/Assets/Ground037_1K-JPG/Ground037_1K_Roughness.jpg b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Roughness.jpg new file mode 100644 index 00000000..8f81c4b8 Binary files /dev/null and b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Roughness.jpg differ diff --git a/clock/Assets/Ground037_1K-JPG/Ground037_1K_Roughness.jpg.meta b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Roughness.jpg.meta new file mode 100644 index 00000000..a93d6eba --- /dev/null +++ b/clock/Assets/Ground037_1K-JPG/Ground037_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 0cdb3e943fd003b48b52b01f27d83ead +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: -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 + 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 + 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/clock/Assets/Ground042_1K-JPG.meta b/clock/Assets/Ground042_1K-JPG.meta new file mode 100644 index 00000000..1eca934a --- /dev/null +++ b/clock/Assets/Ground042_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e4e4f291b90de7e4bb058d26d8eddafb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg b/clock/Assets/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..ea9b0d3f Binary files /dev/null and b/clock/Assets/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..a3aee056 --- /dev/null +++ b/clock/Assets/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: cb243723315bd9d4283ca5d7afaa511a +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: -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 + 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 + 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/clock/Assets/Ground042_1K-JPG/Ground042_1K_Color.jpg b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Color.jpg new file mode 100644 index 00000000..b2b2a4b1 Binary files /dev/null and b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Color.jpg differ diff --git a/clock/Assets/Ground042_1K-JPG/Ground042_1K_Color.jpg.meta b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Color.jpg.meta new file mode 100644 index 00000000..70ae9bc0 --- /dev/null +++ b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 5788d3df9313fd0419fa1533977c2730 +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: -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 + 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 + 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/clock/Assets/Ground042_1K-JPG/Ground042_1K_Displacement.jpg b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Displacement.jpg new file mode 100644 index 00000000..fe75d595 Binary files /dev/null and b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Displacement.jpg differ diff --git a/clock/Assets/Ground042_1K-JPG/Ground042_1K_Displacement.jpg.meta b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Displacement.jpg.meta new file mode 100644 index 00000000..d378d220 --- /dev/null +++ b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 3d49a7d3a0767ec46b68c7b678887640 +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: -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 + 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 + 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/clock/Assets/Ground042_1K-JPG/Ground042_1K_Normal.jpg b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Normal.jpg new file mode 100644 index 00000000..52e616fb Binary files /dev/null and b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Normal.jpg differ diff --git a/clock/Assets/Ground042_1K-JPG/Ground042_1K_Normal.jpg.meta b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Normal.jpg.meta new file mode 100644 index 00000000..5995d948 --- /dev/null +++ b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 95e655b4bd2613f4388d81dfa5045e4b +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: -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 + 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 + 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/clock/Assets/Ground042_1K-JPG/Ground042_1K_Roughness.jpg b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Roughness.jpg new file mode 100644 index 00000000..afdcd7ce Binary files /dev/null and b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Roughness.jpg differ diff --git a/clock/Assets/Ground042_1K-JPG/Ground042_1K_Roughness.jpg.meta b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Roughness.jpg.meta new file mode 100644 index 00000000..9b0675cc --- /dev/null +++ b/clock/Assets/Ground042_1K-JPG/Ground042_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: ba44ffebb004fee46a9c370ca7881d21 +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: -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 + 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 + 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/clock/Assets/Materiały.meta b/clock/Assets/Materiały.meta new file mode 100644 index 00000000..f3bc5c30 --- /dev/null +++ b/clock/Assets/Materiały.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 75962aae05bc9454cab97fd6c9c4f4e5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Materiały/Clock.mat b/clock/Assets/Materiały/Clock.mat new file mode 100644 index 00000000..7dc774e6 --- /dev/null +++ b/clock/Assets/Materiały/Clock.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Clock + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHAPREMULTIPLY_ON + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 3ca5e46c6deb4fd4e8fb4c6750dd0707, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 10 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 3 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 0 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/clock/Assets/Materiały/Clock.mat.meta b/clock/Assets/Materiały/Clock.mat.meta new file mode 100644 index 00000000..616de2df --- /dev/null +++ b/clock/Assets/Materiały/Clock.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8daa59306c7c2cf458f0a11f0cf47fe4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Materiały/ClockHand.mat b/clock/Assets/Materiały/ClockHand.mat new file mode 100644 index 00000000..85f88e7b --- /dev/null +++ b/clock/Assets/Materiały/ClockHand.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ClockHand + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 1 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 0.71337444, b: 0.5707547, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/clock/Assets/Materiały/ClockHand.mat.meta b/clock/Assets/Materiały/ClockHand.mat.meta new file mode 100644 index 00000000..6aed0d9d --- /dev/null +++ b/clock/Assets/Materiały/ClockHand.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 693fcfd2740164b418001f680fdae925 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Moss002_1K-JPG.meta b/clock/Assets/Moss002_1K-JPG.meta new file mode 100644 index 00000000..1a765133 --- /dev/null +++ b/clock/Assets/Moss002_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6e499639807cbed478107ac44f4a1d98 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg b/clock/Assets/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..6e5a5336 Binary files /dev/null and b/clock/Assets/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..aab20e02 --- /dev/null +++ b/clock/Assets/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: de32b1f0e9e836f449ca51819fe4df02 +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: -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 + 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 + 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/clock/Assets/Moss002_1K-JPG/Moss002_1K_Color.jpg b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Color.jpg new file mode 100644 index 00000000..b98da299 Binary files /dev/null and b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Color.jpg differ diff --git a/clock/Assets/Moss002_1K-JPG/Moss002_1K_Color.jpg.meta b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Color.jpg.meta new file mode 100644 index 00000000..711fd495 --- /dev/null +++ b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 5583043a4464bed48af87c082561af13 +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: -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 + 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 + 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/clock/Assets/Moss002_1K-JPG/Moss002_1K_Displacement.jpg b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Displacement.jpg new file mode 100644 index 00000000..1269fd10 Binary files /dev/null and b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Displacement.jpg differ diff --git a/clock/Assets/Moss002_1K-JPG/Moss002_1K_Displacement.jpg.meta b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Displacement.jpg.meta new file mode 100644 index 00000000..d598a41a --- /dev/null +++ b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 2bf856cacd17539468cff3d08c3b4648 +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: -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 + 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 + 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/clock/Assets/Moss002_1K-JPG/Moss002_1K_Normal.jpg b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Normal.jpg new file mode 100644 index 00000000..c3ac0262 Binary files /dev/null and b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Normal.jpg differ diff --git a/clock/Assets/Moss002_1K-JPG/Moss002_1K_Normal.jpg.meta b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Normal.jpg.meta new file mode 100644 index 00000000..b348c2c9 --- /dev/null +++ b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: a3634f4e7a9490d4e8855d726f8da103 +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: -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 + 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 + 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/clock/Assets/Moss002_1K-JPG/Moss002_1K_Roughness.jpg b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Roughness.jpg new file mode 100644 index 00000000..7b96e41f Binary files /dev/null and b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Roughness.jpg differ diff --git a/clock/Assets/Moss002_1K-JPG/Moss002_1K_Roughness.jpg.meta b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Roughness.jpg.meta new file mode 100644 index 00000000..29d5b602 --- /dev/null +++ b/clock/Assets/Moss002_1K-JPG/Moss002_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 711002746a59a934c83ea34af32c52da +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: -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 + 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 + 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/clock/Assets/Scenes.meta b/clock/Assets/Scenes.meta new file mode 100644 index 00000000..8a18a7b9 --- /dev/null +++ b/clock/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b9a6f28300d9008488a8af5bcc629379 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Scenes/SampleScene.unity b/clock/Assets/Scenes/SampleScene.unity new file mode 100644 index 00000000..b906aeea --- /dev/null +++ b/clock/Assets/Scenes/SampleScene.unity @@ -0,0 +1,500 @@ +%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.446679, g: 0.49653035, b: 0.57487845, 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: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + 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 &697477823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 697477828} + - component: {fileID: 697477827} + - component: {fileID: 697477826} + - component: {fileID: 697477825} + - component: {fileID: 697477824} + m_Layer: 0 + m_Name: Clock + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &697477824 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697477823} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &697477825 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697477823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 71b896f57bd042145adf17b244090e61, type: 3} + m_Name: + m_EditorClassIdentifier: + clockHand: {fileID: 1717400434} +--- !u!23 &697477826 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697477823} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8daa59306c7c2cf458f0a11f0cf47fe4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &697477827 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697477823} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &697477828 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697477823} + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {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_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + 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: 1 + 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 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_LocalRotation: {x: 0.4141571, y: -0.46792892, z: 0.13430667, w: 0.7690762} + 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: 49.705, y: -70.203, z: -16.253} +--- !u!1 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {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_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {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_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 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: 0, y: 5, z: 10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!1 &1717400434 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1717400438} + - component: {fileID: 1717400437} + - component: {fileID: 1717400436} + - component: {fileID: 1717400435} + m_Layer: 0 + m_Name: ClockHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!136 &1717400435 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1717400434} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &1717400436 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1717400434} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 693fcfd2740164b418001f680fdae925, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1717400437 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1717400434} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1717400438 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1717400434} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4.4597077, y: 3.3780527, z: 1.0700607} + 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} diff --git a/clock/Assets/Scenes/SampleScene.unity.meta b/clock/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 00000000..952bd1e9 --- /dev/null +++ b/clock/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9fc0d4010bbf28b4594072e72b8655ab +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Skrypty.meta b/clock/Assets/Skrypty.meta new file mode 100644 index 00000000..e7fe5859 --- /dev/null +++ b/clock/Assets/Skrypty.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a433ee0249dfd9a4e992214bfab3e761 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Skrypty/Clock.cs b/clock/Assets/Skrypty/Clock.cs new file mode 100644 index 00000000..fcf47ee9 --- /dev/null +++ b/clock/Assets/Skrypty/Clock.cs @@ -0,0 +1,51 @@ +using System.Collections; +using System.Collections.Generic; +using System; +using UnityEngine; + +public class Clock : MonoBehaviour +{ + public GameObject clockHand; + void Start() + { + + } + + void Update() + { + var dateTimeNow = DateTime.Now; + //float swHour = 0.0f; + //float swMinute = 0.0f; + //float swSecond = 0.0f; + // Global Time: + float hour = dateTimeNow.Hour; + float minute = dateTimeNow.Minute; + float second = dateTimeNow.Second; + Debug.Log("asdd"); + Debug.Log($"Time: {hour}:{minute}:{second}"); + // Ustaw pozycje, rozmiar i obrót wskazówek zegara z wykorzystaniem przekształceń macierzowych: + // (Matrix4x4.Translate, Matrix4x4.Scale, Matrix4x4.Rotate) dwa pierwsze przyjmują Vector3, a obroty przyjmują Quaternion.Euler( X, Y, Z) (już bez new, bo to funkcja) + + var transformationHsw = Matrix4x4.Translate(new Vector3(0, 0, hour)); + var transformationMsw = Matrix4x4.Translate(new Vector3(0, 0, minute)); + var transformationSsw = Matrix4x4.Translate(new Vector3(0, 0, second)); + + var transformationH = Matrix4x4.Translate(new Vector3(0, 5.0f, 0.0f)) * Matrix4x4.Rotate(Quaternion.Euler(0.0f, 0.0f, hour * 30.0f)) * Matrix4x4.Scale(new Vector3(0.4f, 1.5f, 0.4f)) * Matrix4x4.Translate(new Vector3(0, 1.0f, 0.0f)); + var transformationM = Matrix4x4.Translate(new Vector3(0, 5.0f, 0.0f)) * Matrix4x4.Rotate(Quaternion.Euler(0.0f, 0.0f, minute * 6.0f)) * Matrix4x4.Scale(new Vector3(0.3f, 2.5f, 0.3f)) * Matrix4x4.Translate(new Vector3(0, 1.0f, 0.0f)); + var transformationS = Matrix4x4.Translate(new Vector3(0, 5.0f, 0.0f)) * Matrix4x4.Rotate(Quaternion.Euler(0.0f, 0.0f, second * 6.0f)) * Matrix4x4.Scale(new Vector3(0.1f, 3.0f, 0.1f)) * Matrix4x4.Translate(new Vector3(0, 1.0f, 0.0f)); + + // Create game objects instances + + Graphics.DrawMeshInstanced( + clockHand.GetComponent().mesh, + 0, + clockHand.GetComponent().material, + new Matrix4x4[3] + { + transformationH, + transformationM, + transformationS + }); + + } +} diff --git a/clock/Assets/Skrypty/Clock.cs.meta b/clock/Assets/Skrypty/Clock.cs.meta new file mode 100644 index 00000000..29f7254e --- /dev/null +++ b/clock/Assets/Skrypty/Clock.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 71b896f57bd042145adf17b244090e61 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Tekstury.meta b/clock/Assets/Tekstury.meta new file mode 100644 index 00000000..69b24050 --- /dev/null +++ b/clock/Assets/Tekstury.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 774ea2af696570d42ae3e67088149d45 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Tekstury/Grass-025.jpg b/clock/Assets/Tekstury/Grass-025.jpg new file mode 100644 index 00000000..537a065d Binary files /dev/null and b/clock/Assets/Tekstury/Grass-025.jpg differ diff --git a/clock/Assets/Tekstury/Grass-025.jpg.meta b/clock/Assets/Tekstury/Grass-025.jpg.meta new file mode 100644 index 00000000..42ca2785 --- /dev/null +++ b/clock/Assets/Tekstury/Grass-025.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 3bdcb2a7bb5849c43a17734c33b33d4b +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: -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 + 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 + 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/clock/Assets/Tekstury/Gravel020_1K-JPG.meta b/clock/Assets/Tekstury/Gravel020_1K-JPG.meta new file mode 100644 index 00000000..046cd597 --- /dev/null +++ b/clock/Assets/Tekstury/Gravel020_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cdf649defa67e034d909c0f30521c7a3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..ad0097a0 Binary files /dev/null and b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..2c9af9c0 --- /dev/null +++ b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: cc9128b588408c741a756068cea2238a +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: -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 + 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 + 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/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Color.jpg b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Color.jpg new file mode 100644 index 00000000..618b0892 Binary files /dev/null and b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Color.jpg differ diff --git a/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Color.jpg.meta b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Color.jpg.meta new file mode 100644 index 00000000..5775bc86 --- /dev/null +++ b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 836350eda01115148a8da8d814ca3755 +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: -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 + 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 + 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/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg new file mode 100644 index 00000000..57f6fa7a Binary files /dev/null and b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg differ diff --git a/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg.meta b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg.meta new file mode 100644 index 00000000..c6e30485 --- /dev/null +++ b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: f05c62086f21245419832cacac798d71 +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: -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 + 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 + 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/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg new file mode 100644 index 00000000..e5ba8a14 Binary files /dev/null and b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg differ diff --git a/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg.meta b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg.meta new file mode 100644 index 00000000..5d184860 --- /dev/null +++ b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_IdMask.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 207a426e1d0a88847a478557f9dd3cf7 +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: -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 + 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 + 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/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg new file mode 100644 index 00000000..c8308577 Binary files /dev/null and b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg differ diff --git a/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg.meta b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg.meta new file mode 100644 index 00000000..532781b5 --- /dev/null +++ b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: a75db497ba5c9874bbbd9e016eabb144 +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: -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 + 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 + 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/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg new file mode 100644 index 00000000..dcbaf573 Binary files /dev/null and b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg differ diff --git a/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg.meta b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg.meta new file mode 100644 index 00000000..cd257b13 --- /dev/null +++ b/clock/Assets/Tekstury/Gravel020_1K-JPG/Gravel020_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 41e95b74628a5b040bd4a8414581e9b4 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground019_1K-JPG.meta b/clock/Assets/Tekstury/Ground019_1K-JPG.meta new file mode 100644 index 00000000..1bb35805 --- /dev/null +++ b/clock/Assets/Tekstury/Ground019_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d241c346a9eb764394842b82f9d15f4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..b5bdadbb Binary files /dev/null and b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..dd70c871 --- /dev/null +++ b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 92e394b0c4b33034989a79edfd7ca84c +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Color.jpg b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Color.jpg new file mode 100644 index 00000000..a6ef317d Binary files /dev/null and b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Color.jpg differ diff --git a/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Color.jpg.meta b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Color.jpg.meta new file mode 100644 index 00000000..9ca1b600 --- /dev/null +++ b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: d4140fc1cfccb6d4fb1a79da36bffe9a +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Displacement.jpg b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Displacement.jpg new file mode 100644 index 00000000..4f5c8bf5 Binary files /dev/null and b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Displacement.jpg differ diff --git a/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Displacement.jpg.meta b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Displacement.jpg.meta new file mode 100644 index 00000000..a75c282c --- /dev/null +++ b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 3291a962c7df63f47a08db8c82e9aea8 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Normal.jpg b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Normal.jpg new file mode 100644 index 00000000..9f3c872d Binary files /dev/null and b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Normal.jpg differ diff --git a/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Normal.jpg.meta b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Normal.jpg.meta new file mode 100644 index 00000000..239c2bf7 --- /dev/null +++ b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 197ab9d38bb2d8f4eab71f667cec3223 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Roughness.jpg b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Roughness.jpg new file mode 100644 index 00000000..b04b4f69 Binary files /dev/null and b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Roughness.jpg differ diff --git a/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Roughness.jpg.meta b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Roughness.jpg.meta new file mode 100644 index 00000000..e27d32b8 --- /dev/null +++ b/clock/Assets/Tekstury/Ground019_1K-JPG/Ground019_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 6ac73fda012d1cf4abf7ceb9f49e0a34 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground037_1K-JPG.meta b/clock/Assets/Tekstury/Ground037_1K-JPG.meta new file mode 100644 index 00000000..cae97d5b --- /dev/null +++ b/clock/Assets/Tekstury/Ground037_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3cd678bf032452545b9077ef87171d54 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..9f36e2ea Binary files /dev/null and b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..868876b2 --- /dev/null +++ b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: d83663a4217c1944fa6e819e3fcf82c8 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Color.jpg b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Color.jpg new file mode 100644 index 00000000..b388450a Binary files /dev/null and b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Color.jpg differ diff --git a/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Color.jpg.meta b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Color.jpg.meta new file mode 100644 index 00000000..d3d8eff1 --- /dev/null +++ b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 879a32b21d6ccf04f8b246ab12fc6c39 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Displacement.jpg b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Displacement.jpg new file mode 100644 index 00000000..312346ac Binary files /dev/null and b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Displacement.jpg differ diff --git a/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Displacement.jpg.meta b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Displacement.jpg.meta new file mode 100644 index 00000000..3ace6d84 --- /dev/null +++ b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: c7f52bf668b9e7b42a47a5aae815751b +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Normal.jpg b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Normal.jpg new file mode 100644 index 00000000..7f694af6 Binary files /dev/null and b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Normal.jpg differ diff --git a/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Normal.jpg.meta b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Normal.jpg.meta new file mode 100644 index 00000000..65b7d906 --- /dev/null +++ b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 920a9501314f3484c88352517e65b57f +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Roughness.jpg b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Roughness.jpg new file mode 100644 index 00000000..8f81c4b8 Binary files /dev/null and b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Roughness.jpg differ diff --git a/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Roughness.jpg.meta b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Roughness.jpg.meta new file mode 100644 index 00000000..74c8471b --- /dev/null +++ b/clock/Assets/Tekstury/Ground037_1K-JPG/Ground037_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: a460e6a2b8241e64a8d88956f8e31983 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground042_1K-JPG.meta b/clock/Assets/Tekstury/Ground042_1K-JPG.meta new file mode 100644 index 00000000..6e7828db --- /dev/null +++ b/clock/Assets/Tekstury/Ground042_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b447287ce51be94aac7ac4efe0a9395 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..ea9b0d3f Binary files /dev/null and b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..88abf0f4 --- /dev/null +++ b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 6dc941e43638e834981e83a09ad0dbf4 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Color.jpg b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Color.jpg new file mode 100644 index 00000000..b2b2a4b1 Binary files /dev/null and b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Color.jpg differ diff --git a/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Color.jpg.meta b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Color.jpg.meta new file mode 100644 index 00000000..5f5ce6e4 --- /dev/null +++ b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 2458efccc711cf24bb51a7ac5569e5d5 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Displacement.jpg b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Displacement.jpg new file mode 100644 index 00000000..fe75d595 Binary files /dev/null and b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Displacement.jpg differ diff --git a/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Displacement.jpg.meta b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Displacement.jpg.meta new file mode 100644 index 00000000..82c4f066 --- /dev/null +++ b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: bf4dcf59411721943b98c8dd952e7d74 +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Normal.jpg b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Normal.jpg new file mode 100644 index 00000000..52e616fb Binary files /dev/null and b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Normal.jpg differ diff --git a/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Normal.jpg.meta b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Normal.jpg.meta new file mode 100644 index 00000000..fa5bc9c1 --- /dev/null +++ b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: fb1769244d2159647abab30943ae635c +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: -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 + 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 + 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/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Roughness.jpg b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Roughness.jpg new file mode 100644 index 00000000..afdcd7ce Binary files /dev/null and b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Roughness.jpg differ diff --git a/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Roughness.jpg.meta b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Roughness.jpg.meta new file mode 100644 index 00000000..a59fdcff --- /dev/null +++ b/clock/Assets/Tekstury/Ground042_1K-JPG/Ground042_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: ae8d12dbd0e3dc74f805cfd287a1e8f1 +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: -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 + 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 + 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/clock/Assets/Tekstury/Moss002_1K-JPG.meta b/clock/Assets/Tekstury/Moss002_1K-JPG.meta new file mode 100644 index 00000000..3bfe3f6e --- /dev/null +++ b/clock/Assets/Tekstury/Moss002_1K-JPG.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 40298a9f1aa4646408d9bcc9ca0bd8be +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg new file mode 100644 index 00000000..6e5a5336 Binary files /dev/null and b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg differ diff --git a/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg.meta b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg.meta new file mode 100644 index 00000000..70a5d046 --- /dev/null +++ b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_AmbientOcclusion.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 1cf9f21c53021a9478dca56db0a08447 +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: -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 + 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 + 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/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Color.jpg b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Color.jpg new file mode 100644 index 00000000..b98da299 Binary files /dev/null and b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Color.jpg differ diff --git a/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Color.jpg.meta b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Color.jpg.meta new file mode 100644 index 00000000..a67d74d3 --- /dev/null +++ b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Color.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 78a39aedbbb90eb45bebd479e2d1cea8 +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: -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 + 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 + 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/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Displacement.jpg b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Displacement.jpg new file mode 100644 index 00000000..1269fd10 Binary files /dev/null and b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Displacement.jpg differ diff --git a/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Displacement.jpg.meta b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Displacement.jpg.meta new file mode 100644 index 00000000..e5f30f1a --- /dev/null +++ b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Displacement.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: a48abd8fecfe78f498cc2fc0edc11fc8 +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: -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 + 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 + 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/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Normal.jpg b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Normal.jpg new file mode 100644 index 00000000..c3ac0262 Binary files /dev/null and b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Normal.jpg differ diff --git a/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Normal.jpg.meta b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Normal.jpg.meta new file mode 100644 index 00000000..02e68006 --- /dev/null +++ b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Normal.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: fe2e4f3623c7e97408221aade4885bd5 +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: -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 + 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 + 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/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Roughness.jpg b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Roughness.jpg new file mode 100644 index 00000000..7b96e41f Binary files /dev/null and b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Roughness.jpg differ diff --git a/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Roughness.jpg.meta b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Roughness.jpg.meta new file mode 100644 index 00000000..02e9f6b4 --- /dev/null +++ b/clock/Assets/Tekstury/Moss002_1K-JPG/Moss002_1K_Roughness.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: e8ada7f2ace46384691394187c2a9683 +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: -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 + 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 + 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/clock/Assets/Tekstury/clock.png b/clock/Assets/Tekstury/clock.png new file mode 100644 index 00000000..a9924110 Binary files /dev/null and b/clock/Assets/Tekstury/clock.png differ diff --git a/clock/Assets/Tekstury/clock.png.meta b/clock/Assets/Tekstury/clock.png.meta new file mode 100644 index 00000000..99d37297 --- /dev/null +++ b/clock/Assets/Tekstury/clock.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: f6b6e6f9599dcc34caa3a08641d0cac0 +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: -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 + 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 + 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/clock/Assets/clock.png b/clock/Assets/clock.png new file mode 100644 index 00000000..a9924110 Binary files /dev/null and b/clock/Assets/clock.png differ diff --git a/clock/Assets/clock.png.meta b/clock/Assets/clock.png.meta new file mode 100644 index 00000000..6550d52a --- /dev/null +++ b/clock/Assets/clock.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 3ca5e46c6deb4fd4e8fb4c6750dd0707 +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: -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 + 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 + 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/clock/Library/APIUpdater/project-dependencies.graph b/clock/Library/APIUpdater/project-dependencies.graph new file mode 100644 index 00000000..8620e66e Binary files /dev/null and b/clock/Library/APIUpdater/project-dependencies.graph differ diff --git a/clock/Library/AnnotationManager b/clock/Library/AnnotationManager new file mode 100644 index 00000000..eab6d0eb Binary files /dev/null and b/clock/Library/AnnotationManager differ diff --git a/clock/Library/ArtifactDB b/clock/Library/ArtifactDB new file mode 100644 index 00000000..2f0a0b1c Binary files /dev/null and b/clock/Library/ArtifactDB differ diff --git a/clock/Library/ArtifactDB-lock b/clock/Library/ArtifactDB-lock new file mode 100644 index 00000000..b263fcf0 Binary files /dev/null and b/clock/Library/ArtifactDB-lock differ diff --git a/clock/Library/Artifacts/00/002429faa25f6e0ae8a037940872cbcc b/clock/Library/Artifacts/00/002429faa25f6e0ae8a037940872cbcc new file mode 100644 index 00000000..b7e9b4c1 Binary files /dev/null and b/clock/Library/Artifacts/00/002429faa25f6e0ae8a037940872cbcc differ diff --git a/clock/Library/Artifacts/00/0046427ee63fec95886e68c0482b3a00 b/clock/Library/Artifacts/00/0046427ee63fec95886e68c0482b3a00 new file mode 100644 index 00000000..35988e4d Binary files /dev/null and b/clock/Library/Artifacts/00/0046427ee63fec95886e68c0482b3a00 differ diff --git a/clock/Library/Artifacts/00/0048f492f69247d0500f121b97358a9b b/clock/Library/Artifacts/00/0048f492f69247d0500f121b97358a9b new file mode 100644 index 00000000..8b9f706e Binary files /dev/null and b/clock/Library/Artifacts/00/0048f492f69247d0500f121b97358a9b differ diff --git a/clock/Library/Artifacts/01/01022bdd6e696f35ada9fb1f4eace85a b/clock/Library/Artifacts/01/01022bdd6e696f35ada9fb1f4eace85a new file mode 100644 index 00000000..166ead4f Binary files /dev/null and b/clock/Library/Artifacts/01/01022bdd6e696f35ada9fb1f4eace85a differ diff --git a/clock/Library/Artifacts/01/012c4e7ed80308b09d389444902dff1f b/clock/Library/Artifacts/01/012c4e7ed80308b09d389444902dff1f new file mode 100644 index 00000000..b659762f Binary files /dev/null and b/clock/Library/Artifacts/01/012c4e7ed80308b09d389444902dff1f differ diff --git a/clock/Library/Artifacts/01/01473cd7b08f7dc2a1d7e792f6df9da4 b/clock/Library/Artifacts/01/01473cd7b08f7dc2a1d7e792f6df9da4 new file mode 100644 index 00000000..056e31b8 Binary files /dev/null and b/clock/Library/Artifacts/01/01473cd7b08f7dc2a1d7e792f6df9da4 differ diff --git a/clock/Library/Artifacts/01/014d35e93dbde4cbe827deb2534e43b9 b/clock/Library/Artifacts/01/014d35e93dbde4cbe827deb2534e43b9 new file mode 100644 index 00000000..5d9ea858 Binary files /dev/null and b/clock/Library/Artifacts/01/014d35e93dbde4cbe827deb2534e43b9 differ diff --git a/clock/Library/Artifacts/01/0159ca1aebf7cfaa97fb7639eb91bf70 b/clock/Library/Artifacts/01/0159ca1aebf7cfaa97fb7639eb91bf70 new file mode 100644 index 00000000..507e444c Binary files /dev/null and b/clock/Library/Artifacts/01/0159ca1aebf7cfaa97fb7639eb91bf70 differ diff --git a/clock/Library/Artifacts/01/0165d44086991c21eae4e74a9c9d93f0 b/clock/Library/Artifacts/01/0165d44086991c21eae4e74a9c9d93f0 new file mode 100644 index 00000000..749ca806 Binary files /dev/null and b/clock/Library/Artifacts/01/0165d44086991c21eae4e74a9c9d93f0 differ diff --git a/clock/Library/Artifacts/01/01a5495ec9dee8e235585a52d05a4b9f b/clock/Library/Artifacts/01/01a5495ec9dee8e235585a52d05a4b9f new file mode 100644 index 00000000..0d4febbe Binary files /dev/null and b/clock/Library/Artifacts/01/01a5495ec9dee8e235585a52d05a4b9f differ diff --git a/clock/Library/Artifacts/01/01eab57cf2bef9ebced749e4cf729d05 b/clock/Library/Artifacts/01/01eab57cf2bef9ebced749e4cf729d05 new file mode 100644 index 00000000..9438bda6 Binary files /dev/null and b/clock/Library/Artifacts/01/01eab57cf2bef9ebced749e4cf729d05 differ diff --git a/clock/Library/Artifacts/01/01f278ea03959c1866e6e6466cbf63e1 b/clock/Library/Artifacts/01/01f278ea03959c1866e6e6466cbf63e1 new file mode 100644 index 00000000..9a3abff3 Binary files /dev/null and b/clock/Library/Artifacts/01/01f278ea03959c1866e6e6466cbf63e1 differ diff --git a/clock/Library/Artifacts/02/021297a356c9a3305121c69dca09284c b/clock/Library/Artifacts/02/021297a356c9a3305121c69dca09284c new file mode 100644 index 00000000..2da93bd1 Binary files /dev/null and b/clock/Library/Artifacts/02/021297a356c9a3305121c69dca09284c differ diff --git a/clock/Library/Artifacts/02/02244493cf957b1b9c6de3b7ba93d224 b/clock/Library/Artifacts/02/02244493cf957b1b9c6de3b7ba93d224 new file mode 100644 index 00000000..7d5af1f0 Binary files /dev/null and b/clock/Library/Artifacts/02/02244493cf957b1b9c6de3b7ba93d224 differ diff --git a/clock/Library/Artifacts/02/023bf39df1fb02520d28082a7e7220ca b/clock/Library/Artifacts/02/023bf39df1fb02520d28082a7e7220ca new file mode 100644 index 00000000..3874974d Binary files /dev/null and b/clock/Library/Artifacts/02/023bf39df1fb02520d28082a7e7220ca differ diff --git a/clock/Library/Artifacts/02/02477712b804de28c2cfba1db2d8491a b/clock/Library/Artifacts/02/02477712b804de28c2cfba1db2d8491a new file mode 100644 index 00000000..5aa00407 Binary files /dev/null and b/clock/Library/Artifacts/02/02477712b804de28c2cfba1db2d8491a differ diff --git a/clock/Library/Artifacts/02/02dac91d4a0bee27cf02402f8e6623e9 b/clock/Library/Artifacts/02/02dac91d4a0bee27cf02402f8e6623e9 new file mode 100644 index 00000000..bddc8963 Binary files /dev/null and b/clock/Library/Artifacts/02/02dac91d4a0bee27cf02402f8e6623e9 differ diff --git a/clock/Library/Artifacts/02/02ed30ee9c09eb17d678a784bc4192b2 b/clock/Library/Artifacts/02/02ed30ee9c09eb17d678a784bc4192b2 new file mode 100644 index 00000000..0b3f57f6 Binary files /dev/null and b/clock/Library/Artifacts/02/02ed30ee9c09eb17d678a784bc4192b2 differ diff --git a/clock/Library/Artifacts/02/02ee8ba800e0e47d8fb98ddc253d7eb1 b/clock/Library/Artifacts/02/02ee8ba800e0e47d8fb98ddc253d7eb1 new file mode 100644 index 00000000..3013f677 Binary files /dev/null and b/clock/Library/Artifacts/02/02ee8ba800e0e47d8fb98ddc253d7eb1 differ diff --git a/clock/Library/Artifacts/03/0307aee9090f67285022d496f5669e26 b/clock/Library/Artifacts/03/0307aee9090f67285022d496f5669e26 new file mode 100644 index 00000000..4c7447c8 Binary files /dev/null and b/clock/Library/Artifacts/03/0307aee9090f67285022d496f5669e26 differ diff --git a/clock/Library/Artifacts/03/0312611ac7d817d672f772c86abc2bf1 b/clock/Library/Artifacts/03/0312611ac7d817d672f772c86abc2bf1 new file mode 100644 index 00000000..8151c611 Binary files /dev/null and b/clock/Library/Artifacts/03/0312611ac7d817d672f772c86abc2bf1 differ diff --git a/clock/Library/Artifacts/03/031a9f2444e9e144972b584ed34e6ce8 b/clock/Library/Artifacts/03/031a9f2444e9e144972b584ed34e6ce8 new file mode 100644 index 00000000..6862ac66 Binary files /dev/null and b/clock/Library/Artifacts/03/031a9f2444e9e144972b584ed34e6ce8 differ diff --git a/clock/Library/Artifacts/03/035a15502159d881d3f9b50d8fa6ef44 b/clock/Library/Artifacts/03/035a15502159d881d3f9b50d8fa6ef44 new file mode 100644 index 00000000..d6d64b2e Binary files /dev/null and b/clock/Library/Artifacts/03/035a15502159d881d3f9b50d8fa6ef44 differ diff --git a/clock/Library/Artifacts/03/03bd960fa8c9db65d0fdf52a53b2a97c b/clock/Library/Artifacts/03/03bd960fa8c9db65d0fdf52a53b2a97c new file mode 100644 index 00000000..e0dee90e Binary files /dev/null and b/clock/Library/Artifacts/03/03bd960fa8c9db65d0fdf52a53b2a97c differ diff --git a/clock/Library/Artifacts/04/04065bf5410f26c8c2fd35041a946c9d b/clock/Library/Artifacts/04/04065bf5410f26c8c2fd35041a946c9d new file mode 100644 index 00000000..541b0b71 Binary files /dev/null and b/clock/Library/Artifacts/04/04065bf5410f26c8c2fd35041a946c9d differ diff --git a/clock/Library/Artifacts/04/0409c57e36672222c2b5b60951040e55 b/clock/Library/Artifacts/04/0409c57e36672222c2b5b60951040e55 new file mode 100644 index 00000000..393eb048 Binary files /dev/null and b/clock/Library/Artifacts/04/0409c57e36672222c2b5b60951040e55 differ diff --git a/clock/Library/Artifacts/04/040a51acc652e7cf81375ba7424bd3de b/clock/Library/Artifacts/04/040a51acc652e7cf81375ba7424bd3de new file mode 100644 index 00000000..dd553984 Binary files /dev/null and b/clock/Library/Artifacts/04/040a51acc652e7cf81375ba7424bd3de differ diff --git a/clock/Library/Artifacts/04/0431b002459387bdeb237c9db6d6f83a b/clock/Library/Artifacts/04/0431b002459387bdeb237c9db6d6f83a new file mode 100644 index 00000000..a6ad8ff5 Binary files /dev/null and b/clock/Library/Artifacts/04/0431b002459387bdeb237c9db6d6f83a differ diff --git a/clock/Library/Artifacts/04/0435a5e500af8b53b14ad74109726a44 b/clock/Library/Artifacts/04/0435a5e500af8b53b14ad74109726a44 new file mode 100644 index 00000000..f6e5e5af Binary files /dev/null and b/clock/Library/Artifacts/04/0435a5e500af8b53b14ad74109726a44 differ diff --git a/clock/Library/Artifacts/04/044f7eef35855f055537908bff7f86a8 b/clock/Library/Artifacts/04/044f7eef35855f055537908bff7f86a8 new file mode 100644 index 00000000..9c9834c4 Binary files /dev/null and b/clock/Library/Artifacts/04/044f7eef35855f055537908bff7f86a8 differ diff --git a/clock/Library/Artifacts/04/046fe2fc1cf736bc6dd337f03a7b02ff b/clock/Library/Artifacts/04/046fe2fc1cf736bc6dd337f03a7b02ff new file mode 100644 index 00000000..c996cae8 Binary files /dev/null and b/clock/Library/Artifacts/04/046fe2fc1cf736bc6dd337f03a7b02ff differ diff --git a/clock/Library/Artifacts/04/0479f1ce38b8a384221064e161af95a6 b/clock/Library/Artifacts/04/0479f1ce38b8a384221064e161af95a6 new file mode 100644 index 00000000..3fb6350b Binary files /dev/null and b/clock/Library/Artifacts/04/0479f1ce38b8a384221064e161af95a6 differ diff --git a/clock/Library/Artifacts/04/04bcaf8a80cb7438e55e40eea69eca73 b/clock/Library/Artifacts/04/04bcaf8a80cb7438e55e40eea69eca73 new file mode 100644 index 00000000..9af801c9 Binary files /dev/null and b/clock/Library/Artifacts/04/04bcaf8a80cb7438e55e40eea69eca73 differ diff --git a/clock/Library/Artifacts/04/04c131b91e3715d98e63517f94f15b66 b/clock/Library/Artifacts/04/04c131b91e3715d98e63517f94f15b66 new file mode 100644 index 00000000..a2bfe2ac Binary files /dev/null and b/clock/Library/Artifacts/04/04c131b91e3715d98e63517f94f15b66 differ diff --git a/clock/Library/Artifacts/04/04c77ed7ee399022ca87b785128e7b5b b/clock/Library/Artifacts/04/04c77ed7ee399022ca87b785128e7b5b new file mode 100644 index 00000000..23b1b212 Binary files /dev/null and b/clock/Library/Artifacts/04/04c77ed7ee399022ca87b785128e7b5b differ diff --git a/clock/Library/Artifacts/04/04f186880a25cf7e521ce639102be1ca b/clock/Library/Artifacts/04/04f186880a25cf7e521ce639102be1ca new file mode 100644 index 00000000..851471ad Binary files /dev/null and b/clock/Library/Artifacts/04/04f186880a25cf7e521ce639102be1ca differ diff --git a/clock/Library/Artifacts/05/053c967881588f90bfb63f7f8b83885c b/clock/Library/Artifacts/05/053c967881588f90bfb63f7f8b83885c new file mode 100644 index 00000000..29925fc3 Binary files /dev/null and b/clock/Library/Artifacts/05/053c967881588f90bfb63f7f8b83885c differ diff --git a/clock/Library/Artifacts/05/054d80accd83879fb00b8df92f8dc849 b/clock/Library/Artifacts/05/054d80accd83879fb00b8df92f8dc849 new file mode 100644 index 00000000..3212646a Binary files /dev/null and b/clock/Library/Artifacts/05/054d80accd83879fb00b8df92f8dc849 differ diff --git a/clock/Library/Artifacts/05/0551961928f8fa8c2fd55dd65bbfbcad b/clock/Library/Artifacts/05/0551961928f8fa8c2fd55dd65bbfbcad new file mode 100644 index 00000000..c49f2c71 Binary files /dev/null and b/clock/Library/Artifacts/05/0551961928f8fa8c2fd55dd65bbfbcad differ diff --git a/clock/Library/Artifacts/05/055e70c6f791a12e38bfbd078f426a32 b/clock/Library/Artifacts/05/055e70c6f791a12e38bfbd078f426a32 new file mode 100644 index 00000000..d1d41700 Binary files /dev/null and b/clock/Library/Artifacts/05/055e70c6f791a12e38bfbd078f426a32 differ diff --git a/clock/Library/Artifacts/05/057b8db2651150085b70fac02891d722 b/clock/Library/Artifacts/05/057b8db2651150085b70fac02891d722 new file mode 100644 index 00000000..1ce146f4 Binary files /dev/null and b/clock/Library/Artifacts/05/057b8db2651150085b70fac02891d722 differ diff --git a/clock/Library/Artifacts/06/06025a1d0aae9121284233e283cfe516 b/clock/Library/Artifacts/06/06025a1d0aae9121284233e283cfe516 new file mode 100644 index 00000000..6ae11894 Binary files /dev/null and b/clock/Library/Artifacts/06/06025a1d0aae9121284233e283cfe516 differ diff --git a/clock/Library/Artifacts/06/062861e31e6f087e9997df13d69f827e b/clock/Library/Artifacts/06/062861e31e6f087e9997df13d69f827e new file mode 100644 index 00000000..392db67e Binary files /dev/null and b/clock/Library/Artifacts/06/062861e31e6f087e9997df13d69f827e differ diff --git a/clock/Library/Artifacts/06/063e4b83740b3e888a1d4d7750b9151e b/clock/Library/Artifacts/06/063e4b83740b3e888a1d4d7750b9151e new file mode 100644 index 00000000..dd07a951 Binary files /dev/null and b/clock/Library/Artifacts/06/063e4b83740b3e888a1d4d7750b9151e differ diff --git a/clock/Library/Artifacts/06/06bd0e454544ec4c8b6a5d58894aeb82 b/clock/Library/Artifacts/06/06bd0e454544ec4c8b6a5d58894aeb82 new file mode 100644 index 00000000..b102ff74 Binary files /dev/null and b/clock/Library/Artifacts/06/06bd0e454544ec4c8b6a5d58894aeb82 differ diff --git a/clock/Library/Artifacts/06/06e4132bdd6b554e6e477431b44a7f55 b/clock/Library/Artifacts/06/06e4132bdd6b554e6e477431b44a7f55 new file mode 100644 index 00000000..ad7832a0 Binary files /dev/null and b/clock/Library/Artifacts/06/06e4132bdd6b554e6e477431b44a7f55 differ diff --git a/clock/Library/Artifacts/07/0703d9eae1663140192f2ad3bd13fbe6 b/clock/Library/Artifacts/07/0703d9eae1663140192f2ad3bd13fbe6 new file mode 100644 index 00000000..c5a60bb2 Binary files /dev/null and b/clock/Library/Artifacts/07/0703d9eae1663140192f2ad3bd13fbe6 differ diff --git a/clock/Library/Artifacts/07/07411704abb770ce780209f3469b417d b/clock/Library/Artifacts/07/07411704abb770ce780209f3469b417d new file mode 100644 index 00000000..55d019fc Binary files /dev/null and b/clock/Library/Artifacts/07/07411704abb770ce780209f3469b417d differ diff --git a/clock/Library/Artifacts/07/077490a3fcaeeb1d05c6bee5c3c26907 b/clock/Library/Artifacts/07/077490a3fcaeeb1d05c6bee5c3c26907 new file mode 100644 index 00000000..e4bbd9ce Binary files /dev/null and b/clock/Library/Artifacts/07/077490a3fcaeeb1d05c6bee5c3c26907 differ diff --git a/clock/Library/Artifacts/07/07bc3d6382e3f5d29d5918c5cdd5eca5 b/clock/Library/Artifacts/07/07bc3d6382e3f5d29d5918c5cdd5eca5 new file mode 100644 index 00000000..cafe706c Binary files /dev/null and b/clock/Library/Artifacts/07/07bc3d6382e3f5d29d5918c5cdd5eca5 differ diff --git a/clock/Library/Artifacts/07/07bdb91c953d81bfcecf524b813c45cc b/clock/Library/Artifacts/07/07bdb91c953d81bfcecf524b813c45cc new file mode 100644 index 00000000..263a9a6d Binary files /dev/null and b/clock/Library/Artifacts/07/07bdb91c953d81bfcecf524b813c45cc differ diff --git a/clock/Library/Artifacts/07/07d750f8b28b3073fe4fcd0c028fd4d6 b/clock/Library/Artifacts/07/07d750f8b28b3073fe4fcd0c028fd4d6 new file mode 100644 index 00000000..2baae7f0 Binary files /dev/null and b/clock/Library/Artifacts/07/07d750f8b28b3073fe4fcd0c028fd4d6 differ diff --git a/clock/Library/Artifacts/07/07eee7427ee5dcd029b87bc41714cf42 b/clock/Library/Artifacts/07/07eee7427ee5dcd029b87bc41714cf42 new file mode 100644 index 00000000..d6a61835 Binary files /dev/null and b/clock/Library/Artifacts/07/07eee7427ee5dcd029b87bc41714cf42 differ diff --git a/clock/Library/Artifacts/07/07fdea8774eca38894060d220d02e4d0 b/clock/Library/Artifacts/07/07fdea8774eca38894060d220d02e4d0 new file mode 100644 index 00000000..5ceda151 Binary files /dev/null and b/clock/Library/Artifacts/07/07fdea8774eca38894060d220d02e4d0 differ diff --git a/clock/Library/Artifacts/08/0809c87e370004cd801fc582f890c434 b/clock/Library/Artifacts/08/0809c87e370004cd801fc582f890c434 new file mode 100644 index 00000000..69428e9f Binary files /dev/null and b/clock/Library/Artifacts/08/0809c87e370004cd801fc582f890c434 differ diff --git a/clock/Library/Artifacts/08/0859db23d7f9b488baae37245e3a5b70 b/clock/Library/Artifacts/08/0859db23d7f9b488baae37245e3a5b70 new file mode 100644 index 00000000..4777dc2d Binary files /dev/null and b/clock/Library/Artifacts/08/0859db23d7f9b488baae37245e3a5b70 differ diff --git a/clock/Library/Artifacts/08/08617a080216cb26e5198a78944eab15 b/clock/Library/Artifacts/08/08617a080216cb26e5198a78944eab15 new file mode 100644 index 00000000..6c616fc6 Binary files /dev/null and b/clock/Library/Artifacts/08/08617a080216cb26e5198a78944eab15 differ diff --git a/clock/Library/Artifacts/08/0874b5ff00b026194b3ab2ce721e35b6 b/clock/Library/Artifacts/08/0874b5ff00b026194b3ab2ce721e35b6 new file mode 100644 index 00000000..5ed27999 Binary files /dev/null and b/clock/Library/Artifacts/08/0874b5ff00b026194b3ab2ce721e35b6 differ diff --git a/clock/Library/Artifacts/08/0896329762138c342c46bf13534baf19 b/clock/Library/Artifacts/08/0896329762138c342c46bf13534baf19 new file mode 100644 index 00000000..4e735421 Binary files /dev/null and b/clock/Library/Artifacts/08/0896329762138c342c46bf13534baf19 differ diff --git a/clock/Library/Artifacts/08/08bbd194f584eef0b58d5230b56f19d6 b/clock/Library/Artifacts/08/08bbd194f584eef0b58d5230b56f19d6 new file mode 100644 index 00000000..4d3ae5dc Binary files /dev/null and b/clock/Library/Artifacts/08/08bbd194f584eef0b58d5230b56f19d6 differ diff --git a/clock/Library/Artifacts/08/08d2e70566b71280519bee30f1e74e31 b/clock/Library/Artifacts/08/08d2e70566b71280519bee30f1e74e31 new file mode 100644 index 00000000..1f2b26a7 Binary files /dev/null and b/clock/Library/Artifacts/08/08d2e70566b71280519bee30f1e74e31 differ diff --git a/clock/Library/Artifacts/09/096a700794d26d711a27e9e6d2510254 b/clock/Library/Artifacts/09/096a700794d26d711a27e9e6d2510254 new file mode 100644 index 00000000..ba26a0fc Binary files /dev/null and b/clock/Library/Artifacts/09/096a700794d26d711a27e9e6d2510254 differ diff --git a/clock/Library/Artifacts/09/099e0148ba70d7c454f65c977d195d01 b/clock/Library/Artifacts/09/099e0148ba70d7c454f65c977d195d01 new file mode 100644 index 00000000..14b3b20d Binary files /dev/null and b/clock/Library/Artifacts/09/099e0148ba70d7c454f65c977d195d01 differ diff --git a/clock/Library/Artifacts/09/09b0674be3d8bc25ec59256f0ba140fc b/clock/Library/Artifacts/09/09b0674be3d8bc25ec59256f0ba140fc new file mode 100644 index 00000000..3f74ef0d Binary files /dev/null and b/clock/Library/Artifacts/09/09b0674be3d8bc25ec59256f0ba140fc differ diff --git a/clock/Library/Artifacts/09/09e339514c8c7b700853cace5ebb3ac8 b/clock/Library/Artifacts/09/09e339514c8c7b700853cace5ebb3ac8 new file mode 100644 index 00000000..6b5be7f6 Binary files /dev/null and b/clock/Library/Artifacts/09/09e339514c8c7b700853cace5ebb3ac8 differ diff --git a/clock/Library/Artifacts/0a/0a1a18c47f18133c20dd1dc96210f26c b/clock/Library/Artifacts/0a/0a1a18c47f18133c20dd1dc96210f26c new file mode 100644 index 00000000..1c8ca517 Binary files /dev/null and b/clock/Library/Artifacts/0a/0a1a18c47f18133c20dd1dc96210f26c differ diff --git a/clock/Library/Artifacts/0a/0a1bfeb2724f6d8e14ef5b59b47fd06f b/clock/Library/Artifacts/0a/0a1bfeb2724f6d8e14ef5b59b47fd06f new file mode 100644 index 00000000..8f3eee3e Binary files /dev/null and b/clock/Library/Artifacts/0a/0a1bfeb2724f6d8e14ef5b59b47fd06f differ diff --git a/clock/Library/Artifacts/0a/0a660d462146d255508111ae69f369d0 b/clock/Library/Artifacts/0a/0a660d462146d255508111ae69f369d0 new file mode 100644 index 00000000..90f1d6f7 Binary files /dev/null and b/clock/Library/Artifacts/0a/0a660d462146d255508111ae69f369d0 differ diff --git a/clock/Library/Artifacts/0a/0ad05fbced6a27614a064bf090f7f189 b/clock/Library/Artifacts/0a/0ad05fbced6a27614a064bf090f7f189 new file mode 100644 index 00000000..6dfe1697 Binary files /dev/null and b/clock/Library/Artifacts/0a/0ad05fbced6a27614a064bf090f7f189 differ diff --git a/clock/Library/Artifacts/0a/0ad1246156042139f6eecc7f193f4ef4 b/clock/Library/Artifacts/0a/0ad1246156042139f6eecc7f193f4ef4 new file mode 100644 index 00000000..30d33f67 Binary files /dev/null and b/clock/Library/Artifacts/0a/0ad1246156042139f6eecc7f193f4ef4 differ diff --git a/clock/Library/Artifacts/0b/0b30d88854738af1de5d2898f5fdd6d0 b/clock/Library/Artifacts/0b/0b30d88854738af1de5d2898f5fdd6d0 new file mode 100644 index 00000000..d50d651b Binary files /dev/null and b/clock/Library/Artifacts/0b/0b30d88854738af1de5d2898f5fdd6d0 differ diff --git a/clock/Library/Artifacts/0b/0b4927b6bcdd28477d1ed615632eec66 b/clock/Library/Artifacts/0b/0b4927b6bcdd28477d1ed615632eec66 new file mode 100644 index 00000000..ba985671 Binary files /dev/null and b/clock/Library/Artifacts/0b/0b4927b6bcdd28477d1ed615632eec66 differ diff --git a/clock/Library/Artifacts/0b/0bc1c4b7723831baa4ff08f2d1b40239 b/clock/Library/Artifacts/0b/0bc1c4b7723831baa4ff08f2d1b40239 new file mode 100644 index 00000000..1eb22299 Binary files /dev/null and b/clock/Library/Artifacts/0b/0bc1c4b7723831baa4ff08f2d1b40239 differ diff --git a/clock/Library/Artifacts/0b/0bdcfd9c0b0458a2f7804fd1e6178d07 b/clock/Library/Artifacts/0b/0bdcfd9c0b0458a2f7804fd1e6178d07 new file mode 100644 index 00000000..60fab339 Binary files /dev/null and b/clock/Library/Artifacts/0b/0bdcfd9c0b0458a2f7804fd1e6178d07 differ diff --git a/clock/Library/Artifacts/0c/0c93f18b8e5f9005f21ceae19588d158 b/clock/Library/Artifacts/0c/0c93f18b8e5f9005f21ceae19588d158 new file mode 100644 index 00000000..019e8765 Binary files /dev/null and b/clock/Library/Artifacts/0c/0c93f18b8e5f9005f21ceae19588d158 differ diff --git a/clock/Library/Artifacts/0c/0c98bcc075631d40df4e9aa697de32e4 b/clock/Library/Artifacts/0c/0c98bcc075631d40df4e9aa697de32e4 new file mode 100644 index 00000000..2669cf97 Binary files /dev/null and b/clock/Library/Artifacts/0c/0c98bcc075631d40df4e9aa697de32e4 differ diff --git a/clock/Library/Artifacts/0d/0d35174d644d6fea80eabbba74aebb2e b/clock/Library/Artifacts/0d/0d35174d644d6fea80eabbba74aebb2e new file mode 100644 index 00000000..d5038a27 Binary files /dev/null and b/clock/Library/Artifacts/0d/0d35174d644d6fea80eabbba74aebb2e differ diff --git a/clock/Library/Artifacts/0d/0d6d6ff4489b96e8f9980d5d0eb3f972 b/clock/Library/Artifacts/0d/0d6d6ff4489b96e8f9980d5d0eb3f972 new file mode 100644 index 00000000..899643f8 Binary files /dev/null and b/clock/Library/Artifacts/0d/0d6d6ff4489b96e8f9980d5d0eb3f972 differ diff --git a/clock/Library/Artifacts/0d/0d7b7d099d82456f43844ae9eaa78e62 b/clock/Library/Artifacts/0d/0d7b7d099d82456f43844ae9eaa78e62 new file mode 100644 index 00000000..3f933843 Binary files /dev/null and b/clock/Library/Artifacts/0d/0d7b7d099d82456f43844ae9eaa78e62 differ diff --git a/clock/Library/Artifacts/0d/0d82bfc8b78a948b7e9b1f659128f758 b/clock/Library/Artifacts/0d/0d82bfc8b78a948b7e9b1f659128f758 new file mode 100644 index 00000000..639bd1b9 Binary files /dev/null and b/clock/Library/Artifacts/0d/0d82bfc8b78a948b7e9b1f659128f758 differ diff --git a/clock/Library/Artifacts/0d/0db1cadc43019bd329c19c0a1098fe5b b/clock/Library/Artifacts/0d/0db1cadc43019bd329c19c0a1098fe5b new file mode 100644 index 00000000..d128a1c6 Binary files /dev/null and b/clock/Library/Artifacts/0d/0db1cadc43019bd329c19c0a1098fe5b differ diff --git a/clock/Library/Artifacts/0d/0de261a4ed41f0edfb33ff8f7776e34b b/clock/Library/Artifacts/0d/0de261a4ed41f0edfb33ff8f7776e34b new file mode 100644 index 00000000..6ea4f156 Binary files /dev/null and b/clock/Library/Artifacts/0d/0de261a4ed41f0edfb33ff8f7776e34b differ diff --git a/clock/Library/Artifacts/0d/0de61355159f594a8f3ab14ad65c4146 b/clock/Library/Artifacts/0d/0de61355159f594a8f3ab14ad65c4146 new file mode 100644 index 00000000..5d5f8679 Binary files /dev/null and b/clock/Library/Artifacts/0d/0de61355159f594a8f3ab14ad65c4146 differ diff --git a/clock/Library/Artifacts/0e/0e4815667c0642546444b33f7504f6e6 b/clock/Library/Artifacts/0e/0e4815667c0642546444b33f7504f6e6 new file mode 100644 index 00000000..69070676 Binary files /dev/null and b/clock/Library/Artifacts/0e/0e4815667c0642546444b33f7504f6e6 differ diff --git a/clock/Library/Artifacts/0e/0e4a8bfc62db65eab723a69511f2978b b/clock/Library/Artifacts/0e/0e4a8bfc62db65eab723a69511f2978b new file mode 100644 index 00000000..62598003 Binary files /dev/null and b/clock/Library/Artifacts/0e/0e4a8bfc62db65eab723a69511f2978b differ diff --git a/clock/Library/Artifacts/0e/0e6edf9b12f01822a48839be8f1f1d9b b/clock/Library/Artifacts/0e/0e6edf9b12f01822a48839be8f1f1d9b new file mode 100644 index 00000000..4557ac68 Binary files /dev/null and b/clock/Library/Artifacts/0e/0e6edf9b12f01822a48839be8f1f1d9b differ diff --git a/clock/Library/Artifacts/0e/0eb66a419d546cdf2d22dcfa8018eba5 b/clock/Library/Artifacts/0e/0eb66a419d546cdf2d22dcfa8018eba5 new file mode 100644 index 00000000..7dc92d88 Binary files /dev/null and b/clock/Library/Artifacts/0e/0eb66a419d546cdf2d22dcfa8018eba5 differ diff --git a/clock/Library/Artifacts/0e/0ebe799df0a1344dac039962b3f9e801 b/clock/Library/Artifacts/0e/0ebe799df0a1344dac039962b3f9e801 new file mode 100644 index 00000000..8b78806a Binary files /dev/null and b/clock/Library/Artifacts/0e/0ebe799df0a1344dac039962b3f9e801 differ diff --git a/clock/Library/Artifacts/0e/0ed718ee4c5fd96dd0421f9608bc3eff b/clock/Library/Artifacts/0e/0ed718ee4c5fd96dd0421f9608bc3eff new file mode 100644 index 00000000..1b7992f3 Binary files /dev/null and b/clock/Library/Artifacts/0e/0ed718ee4c5fd96dd0421f9608bc3eff differ diff --git a/clock/Library/Artifacts/0e/0ee258c55564939eb4a62c9c674dcacc b/clock/Library/Artifacts/0e/0ee258c55564939eb4a62c9c674dcacc new file mode 100644 index 00000000..0b272a4f Binary files /dev/null and b/clock/Library/Artifacts/0e/0ee258c55564939eb4a62c9c674dcacc differ diff --git a/clock/Library/Artifacts/0f/0f60b0b2e358669afd123533a66b2a3c b/clock/Library/Artifacts/0f/0f60b0b2e358669afd123533a66b2a3c new file mode 100644 index 00000000..d0593310 Binary files /dev/null and b/clock/Library/Artifacts/0f/0f60b0b2e358669afd123533a66b2a3c differ diff --git a/clock/Library/Artifacts/0f/0f91783f6a0131c0527a892bf77f672e b/clock/Library/Artifacts/0f/0f91783f6a0131c0527a892bf77f672e new file mode 100644 index 00000000..0a07fb70 Binary files /dev/null and b/clock/Library/Artifacts/0f/0f91783f6a0131c0527a892bf77f672e differ diff --git a/clock/Library/Artifacts/0f/0fa21722241b2f506f1a5d704e020c22 b/clock/Library/Artifacts/0f/0fa21722241b2f506f1a5d704e020c22 new file mode 100644 index 00000000..cd8b2da3 Binary files /dev/null and b/clock/Library/Artifacts/0f/0fa21722241b2f506f1a5d704e020c22 differ diff --git a/clock/Library/Artifacts/0f/0fb255a6b9ea358464dec4d278166305 b/clock/Library/Artifacts/0f/0fb255a6b9ea358464dec4d278166305 new file mode 100644 index 00000000..62a81ffb Binary files /dev/null and b/clock/Library/Artifacts/0f/0fb255a6b9ea358464dec4d278166305 differ diff --git a/clock/Library/Artifacts/0f/0fc176114e89434ce375636b527c2aa5 b/clock/Library/Artifacts/0f/0fc176114e89434ce375636b527c2aa5 new file mode 100644 index 00000000..6b1555fd Binary files /dev/null and b/clock/Library/Artifacts/0f/0fc176114e89434ce375636b527c2aa5 differ diff --git a/clock/Library/Artifacts/0f/0fc31b7ec89eca3c560668df50b4ba93 b/clock/Library/Artifacts/0f/0fc31b7ec89eca3c560668df50b4ba93 new file mode 100644 index 00000000..87b2c356 Binary files /dev/null and b/clock/Library/Artifacts/0f/0fc31b7ec89eca3c560668df50b4ba93 differ diff --git a/clock/Library/Artifacts/0f/0fc977794367f9f4c9a20754f8487c37 b/clock/Library/Artifacts/0f/0fc977794367f9f4c9a20754f8487c37 new file mode 100644 index 00000000..160846a0 Binary files /dev/null and b/clock/Library/Artifacts/0f/0fc977794367f9f4c9a20754f8487c37 differ diff --git a/clock/Library/Artifacts/0f/0ffc5e7239522ac78faca6c9dbc65262 b/clock/Library/Artifacts/0f/0ffc5e7239522ac78faca6c9dbc65262 new file mode 100644 index 00000000..f3854736 Binary files /dev/null and b/clock/Library/Artifacts/0f/0ffc5e7239522ac78faca6c9dbc65262 differ diff --git a/clock/Library/Artifacts/10/100190709e779d32b956734967092c36 b/clock/Library/Artifacts/10/100190709e779d32b956734967092c36 new file mode 100644 index 00000000..a1deaabc Binary files /dev/null and b/clock/Library/Artifacts/10/100190709e779d32b956734967092c36 differ diff --git a/clock/Library/Artifacts/10/1007e3c152de5279346a5ba2846c50ec b/clock/Library/Artifacts/10/1007e3c152de5279346a5ba2846c50ec new file mode 100644 index 00000000..b1f80b86 Binary files /dev/null and b/clock/Library/Artifacts/10/1007e3c152de5279346a5ba2846c50ec differ diff --git a/clock/Library/Artifacts/10/105aace03497e86bb56b5789553d07ce b/clock/Library/Artifacts/10/105aace03497e86bb56b5789553d07ce new file mode 100644 index 00000000..abfc68b8 Binary files /dev/null and b/clock/Library/Artifacts/10/105aace03497e86bb56b5789553d07ce differ diff --git a/clock/Library/Artifacts/10/10bfea09ac2a28167f387215a7298fae b/clock/Library/Artifacts/10/10bfea09ac2a28167f387215a7298fae new file mode 100644 index 00000000..b2c01fd7 Binary files /dev/null and b/clock/Library/Artifacts/10/10bfea09ac2a28167f387215a7298fae differ diff --git a/clock/Library/Artifacts/10/10ec410da81125952552d773a8e20e75 b/clock/Library/Artifacts/10/10ec410da81125952552d773a8e20e75 new file mode 100644 index 00000000..1c6cf5bd Binary files /dev/null and b/clock/Library/Artifacts/10/10ec410da81125952552d773a8e20e75 differ diff --git a/clock/Library/Artifacts/10/10edce56f1e27b2091f840fad6489c2b b/clock/Library/Artifacts/10/10edce56f1e27b2091f840fad6489c2b new file mode 100644 index 00000000..9f1f9fc2 Binary files /dev/null and b/clock/Library/Artifacts/10/10edce56f1e27b2091f840fad6489c2b differ diff --git a/clock/Library/Artifacts/10/10f7367d424cebf33d9965761e2dbf8e b/clock/Library/Artifacts/10/10f7367d424cebf33d9965761e2dbf8e new file mode 100644 index 00000000..795ead5d Binary files /dev/null and b/clock/Library/Artifacts/10/10f7367d424cebf33d9965761e2dbf8e differ diff --git a/clock/Library/Artifacts/10/10f986b5211572694a6ea6953dc0d9ca b/clock/Library/Artifacts/10/10f986b5211572694a6ea6953dc0d9ca new file mode 100644 index 00000000..27e9fa16 Binary files /dev/null and b/clock/Library/Artifacts/10/10f986b5211572694a6ea6953dc0d9ca differ diff --git a/clock/Library/Artifacts/11/1106972b3b6aa8d3e73f530291b13c75 b/clock/Library/Artifacts/11/1106972b3b6aa8d3e73f530291b13c75 new file mode 100644 index 00000000..264996dd Binary files /dev/null and b/clock/Library/Artifacts/11/1106972b3b6aa8d3e73f530291b13c75 differ diff --git a/clock/Library/Artifacts/11/11186e7ff25d88be810b804c96ac6d56 b/clock/Library/Artifacts/11/11186e7ff25d88be810b804c96ac6d56 new file mode 100644 index 00000000..8366ac87 Binary files /dev/null and b/clock/Library/Artifacts/11/11186e7ff25d88be810b804c96ac6d56 differ diff --git a/clock/Library/Artifacts/11/1118cc67eb9a9b7169d4e44d82d670c5 b/clock/Library/Artifacts/11/1118cc67eb9a9b7169d4e44d82d670c5 new file mode 100644 index 00000000..81d56205 Binary files /dev/null and b/clock/Library/Artifacts/11/1118cc67eb9a9b7169d4e44d82d670c5 differ diff --git a/clock/Library/Artifacts/11/113425f7841a53a657ea5de6ba3788ef b/clock/Library/Artifacts/11/113425f7841a53a657ea5de6ba3788ef new file mode 100644 index 00000000..1ca8bf27 Binary files /dev/null and b/clock/Library/Artifacts/11/113425f7841a53a657ea5de6ba3788ef differ diff --git a/clock/Library/Artifacts/11/115d0d7fb47c91517288a2817977bef2 b/clock/Library/Artifacts/11/115d0d7fb47c91517288a2817977bef2 new file mode 100644 index 00000000..7dae8c1f Binary files /dev/null and b/clock/Library/Artifacts/11/115d0d7fb47c91517288a2817977bef2 differ diff --git a/clock/Library/Artifacts/11/1170f858a318f2ec2684d9b9afd663ea b/clock/Library/Artifacts/11/1170f858a318f2ec2684d9b9afd663ea new file mode 100644 index 00000000..b9a1a46d Binary files /dev/null and b/clock/Library/Artifacts/11/1170f858a318f2ec2684d9b9afd663ea differ diff --git a/clock/Library/Artifacts/11/117987f78d759edcfebef3d2ef1093fa b/clock/Library/Artifacts/11/117987f78d759edcfebef3d2ef1093fa new file mode 100644 index 00000000..c6e64dd2 Binary files /dev/null and b/clock/Library/Artifacts/11/117987f78d759edcfebef3d2ef1093fa differ diff --git a/clock/Library/Artifacts/11/11893022c46645582cd6743e65cbae72 b/clock/Library/Artifacts/11/11893022c46645582cd6743e65cbae72 new file mode 100644 index 00000000..6d9b3134 Binary files /dev/null and b/clock/Library/Artifacts/11/11893022c46645582cd6743e65cbae72 differ diff --git a/clock/Library/Artifacts/11/118aeae9ba3046a6bd1fff0e70e6890e b/clock/Library/Artifacts/11/118aeae9ba3046a6bd1fff0e70e6890e new file mode 100644 index 00000000..fef6d12b Binary files /dev/null and b/clock/Library/Artifacts/11/118aeae9ba3046a6bd1fff0e70e6890e differ diff --git a/clock/Library/Artifacts/11/11d9902b20047f9784ee8a1729902a6f b/clock/Library/Artifacts/11/11d9902b20047f9784ee8a1729902a6f new file mode 100644 index 00000000..cda6a446 Binary files /dev/null and b/clock/Library/Artifacts/11/11d9902b20047f9784ee8a1729902a6f differ diff --git a/clock/Library/Artifacts/11/11f5b1f4f1095d10a96abea84d7541be b/clock/Library/Artifacts/11/11f5b1f4f1095d10a96abea84d7541be new file mode 100644 index 00000000..e5a64279 Binary files /dev/null and b/clock/Library/Artifacts/11/11f5b1f4f1095d10a96abea84d7541be differ diff --git a/clock/Library/Artifacts/12/123a27978b92aa57fd5499fd6875be2e b/clock/Library/Artifacts/12/123a27978b92aa57fd5499fd6875be2e new file mode 100644 index 00000000..2e001404 Binary files /dev/null and b/clock/Library/Artifacts/12/123a27978b92aa57fd5499fd6875be2e differ diff --git a/clock/Library/Artifacts/12/125ed64720046ab2f85f5d178b6a47f5 b/clock/Library/Artifacts/12/125ed64720046ab2f85f5d178b6a47f5 new file mode 100644 index 00000000..9a0abe17 Binary files /dev/null and b/clock/Library/Artifacts/12/125ed64720046ab2f85f5d178b6a47f5 differ diff --git a/clock/Library/Artifacts/12/127abf78d69313fe6f7c7d6fdadf799f b/clock/Library/Artifacts/12/127abf78d69313fe6f7c7d6fdadf799f new file mode 100644 index 00000000..7b39e02b Binary files /dev/null and b/clock/Library/Artifacts/12/127abf78d69313fe6f7c7d6fdadf799f differ diff --git a/clock/Library/Artifacts/12/12ee2ff73c20402861749c4b5312fa82 b/clock/Library/Artifacts/12/12ee2ff73c20402861749c4b5312fa82 new file mode 100644 index 00000000..dcae0de7 Binary files /dev/null and b/clock/Library/Artifacts/12/12ee2ff73c20402861749c4b5312fa82 differ diff --git a/clock/Library/Artifacts/13/131a9cedd905029a711e1898766ce373 b/clock/Library/Artifacts/13/131a9cedd905029a711e1898766ce373 new file mode 100644 index 00000000..e4a56437 Binary files /dev/null and b/clock/Library/Artifacts/13/131a9cedd905029a711e1898766ce373 differ diff --git a/clock/Library/Artifacts/13/1337abcf3db06fcffe2805dfb1710c5c b/clock/Library/Artifacts/13/1337abcf3db06fcffe2805dfb1710c5c new file mode 100644 index 00000000..8eb8694f Binary files /dev/null and b/clock/Library/Artifacts/13/1337abcf3db06fcffe2805dfb1710c5c differ diff --git a/clock/Library/Artifacts/13/1339fd99b741a2cf7f96bc0cb3956506 b/clock/Library/Artifacts/13/1339fd99b741a2cf7f96bc0cb3956506 new file mode 100644 index 00000000..ad156d90 Binary files /dev/null and b/clock/Library/Artifacts/13/1339fd99b741a2cf7f96bc0cb3956506 differ diff --git a/clock/Library/Artifacts/13/13434b101b27ddfaa33e610207f6d2c2 b/clock/Library/Artifacts/13/13434b101b27ddfaa33e610207f6d2c2 new file mode 100644 index 00000000..c73f5099 Binary files /dev/null and b/clock/Library/Artifacts/13/13434b101b27ddfaa33e610207f6d2c2 differ diff --git a/clock/Library/Artifacts/13/1372b8337709c63f55a3f03eb24338a0 b/clock/Library/Artifacts/13/1372b8337709c63f55a3f03eb24338a0 new file mode 100644 index 00000000..dc3caa02 Binary files /dev/null and b/clock/Library/Artifacts/13/1372b8337709c63f55a3f03eb24338a0 differ diff --git a/clock/Library/Artifacts/13/13811f7535e4a4b54ec98d970857f470 b/clock/Library/Artifacts/13/13811f7535e4a4b54ec98d970857f470 new file mode 100644 index 00000000..f2e37db7 Binary files /dev/null and b/clock/Library/Artifacts/13/13811f7535e4a4b54ec98d970857f470 differ diff --git a/clock/Library/Artifacts/13/1391b2b01e61f657f8248735e68aac7c b/clock/Library/Artifacts/13/1391b2b01e61f657f8248735e68aac7c new file mode 100644 index 00000000..47e79a10 Binary files /dev/null and b/clock/Library/Artifacts/13/1391b2b01e61f657f8248735e68aac7c differ diff --git a/clock/Library/Artifacts/13/13ce36920f2816bf028f698523677723 b/clock/Library/Artifacts/13/13ce36920f2816bf028f698523677723 new file mode 100644 index 00000000..e64b4464 Binary files /dev/null and b/clock/Library/Artifacts/13/13ce36920f2816bf028f698523677723 differ diff --git a/clock/Library/Artifacts/14/141b63cea8afec9a8921acd41dccdc74 b/clock/Library/Artifacts/14/141b63cea8afec9a8921acd41dccdc74 new file mode 100644 index 00000000..06772358 Binary files /dev/null and b/clock/Library/Artifacts/14/141b63cea8afec9a8921acd41dccdc74 differ diff --git a/clock/Library/Artifacts/14/144244843f4a3219ea70307be512ac50 b/clock/Library/Artifacts/14/144244843f4a3219ea70307be512ac50 new file mode 100644 index 00000000..6f8b448a Binary files /dev/null and b/clock/Library/Artifacts/14/144244843f4a3219ea70307be512ac50 differ diff --git a/clock/Library/Artifacts/14/1449c57ce65eac849b805b5a25e908e3 b/clock/Library/Artifacts/14/1449c57ce65eac849b805b5a25e908e3 new file mode 100644 index 00000000..067efd66 Binary files /dev/null and b/clock/Library/Artifacts/14/1449c57ce65eac849b805b5a25e908e3 differ diff --git a/clock/Library/Artifacts/14/144a85d6716bc1d1a7a97917e188555b b/clock/Library/Artifacts/14/144a85d6716bc1d1a7a97917e188555b new file mode 100644 index 00000000..388534a2 Binary files /dev/null and b/clock/Library/Artifacts/14/144a85d6716bc1d1a7a97917e188555b differ diff --git a/clock/Library/Artifacts/14/147c10255e416545e090d8e80ad480ef b/clock/Library/Artifacts/14/147c10255e416545e090d8e80ad480ef new file mode 100644 index 00000000..87e2f81c Binary files /dev/null and b/clock/Library/Artifacts/14/147c10255e416545e090d8e80ad480ef differ diff --git a/clock/Library/Artifacts/14/1485b2013ca8ea6bbabf1468a367e05a b/clock/Library/Artifacts/14/1485b2013ca8ea6bbabf1468a367e05a new file mode 100644 index 00000000..adf30b1f Binary files /dev/null and b/clock/Library/Artifacts/14/1485b2013ca8ea6bbabf1468a367e05a differ diff --git a/clock/Library/Artifacts/14/149c64054f92eda81c55b9f20c354cb1 b/clock/Library/Artifacts/14/149c64054f92eda81c55b9f20c354cb1 new file mode 100644 index 00000000..e32ce396 Binary files /dev/null and b/clock/Library/Artifacts/14/149c64054f92eda81c55b9f20c354cb1 differ diff --git a/clock/Library/Artifacts/14/14b01750bf7f5ca41f0e42154e4722d6 b/clock/Library/Artifacts/14/14b01750bf7f5ca41f0e42154e4722d6 new file mode 100644 index 00000000..5047ab22 Binary files /dev/null and b/clock/Library/Artifacts/14/14b01750bf7f5ca41f0e42154e4722d6 differ diff --git a/clock/Library/Artifacts/14/14c3ab8c980a1673ae5a73984f7ff7c0 b/clock/Library/Artifacts/14/14c3ab8c980a1673ae5a73984f7ff7c0 new file mode 100644 index 00000000..da35bffc Binary files /dev/null and b/clock/Library/Artifacts/14/14c3ab8c980a1673ae5a73984f7ff7c0 differ diff --git a/clock/Library/Artifacts/14/14ce0b0bfc741df662f5419335c97534 b/clock/Library/Artifacts/14/14ce0b0bfc741df662f5419335c97534 new file mode 100644 index 00000000..77664864 Binary files /dev/null and b/clock/Library/Artifacts/14/14ce0b0bfc741df662f5419335c97534 differ diff --git a/clock/Library/Artifacts/15/15046145322c31616de45027495fb222 b/clock/Library/Artifacts/15/15046145322c31616de45027495fb222 new file mode 100644 index 00000000..2767e703 Binary files /dev/null and b/clock/Library/Artifacts/15/15046145322c31616de45027495fb222 differ diff --git a/clock/Library/Artifacts/15/154dabff0c425606411d5874fb045ae3 b/clock/Library/Artifacts/15/154dabff0c425606411d5874fb045ae3 new file mode 100644 index 00000000..3b3f4d05 Binary files /dev/null and b/clock/Library/Artifacts/15/154dabff0c425606411d5874fb045ae3 differ diff --git a/clock/Library/Artifacts/15/15e7b01f999424313c9d7bf9a6563ded b/clock/Library/Artifacts/15/15e7b01f999424313c9d7bf9a6563ded new file mode 100644 index 00000000..ab073d8b Binary files /dev/null and b/clock/Library/Artifacts/15/15e7b01f999424313c9d7bf9a6563ded differ diff --git a/clock/Library/Artifacts/15/15fd7e90513c9c8ad488510f868d7634 b/clock/Library/Artifacts/15/15fd7e90513c9c8ad488510f868d7634 new file mode 100644 index 00000000..60b5aca8 Binary files /dev/null and b/clock/Library/Artifacts/15/15fd7e90513c9c8ad488510f868d7634 differ diff --git a/clock/Library/Artifacts/16/16503dc028109165c36d2e07a0602794 b/clock/Library/Artifacts/16/16503dc028109165c36d2e07a0602794 new file mode 100644 index 00000000..7639f85b Binary files /dev/null and b/clock/Library/Artifacts/16/16503dc028109165c36d2e07a0602794 differ diff --git a/clock/Library/Artifacts/16/16543fd202137d90a35ac73e9b22f339 b/clock/Library/Artifacts/16/16543fd202137d90a35ac73e9b22f339 new file mode 100644 index 00000000..b25e2c3d Binary files /dev/null and b/clock/Library/Artifacts/16/16543fd202137d90a35ac73e9b22f339 differ diff --git a/clock/Library/Artifacts/16/167bf8004b4cf0b62faa0871f3dbcbf1 b/clock/Library/Artifacts/16/167bf8004b4cf0b62faa0871f3dbcbf1 new file mode 100644 index 00000000..7a577eda Binary files /dev/null and b/clock/Library/Artifacts/16/167bf8004b4cf0b62faa0871f3dbcbf1 differ diff --git a/clock/Library/Artifacts/16/168025eaf1517613a8722f1e99af787f b/clock/Library/Artifacts/16/168025eaf1517613a8722f1e99af787f new file mode 100644 index 00000000..528a0824 Binary files /dev/null and b/clock/Library/Artifacts/16/168025eaf1517613a8722f1e99af787f differ diff --git a/clock/Library/Artifacts/17/17061912827c86bd7155db965691e4f4 b/clock/Library/Artifacts/17/17061912827c86bd7155db965691e4f4 new file mode 100644 index 00000000..faf557d1 Binary files /dev/null and b/clock/Library/Artifacts/17/17061912827c86bd7155db965691e4f4 differ diff --git a/clock/Library/Artifacts/17/172728e40b3a41ab09042214b00feb39 b/clock/Library/Artifacts/17/172728e40b3a41ab09042214b00feb39 new file mode 100644 index 00000000..cdb639fc Binary files /dev/null and b/clock/Library/Artifacts/17/172728e40b3a41ab09042214b00feb39 differ diff --git a/clock/Library/Artifacts/17/1735759485e4f1ee2aa56269ffcba793 b/clock/Library/Artifacts/17/1735759485e4f1ee2aa56269ffcba793 new file mode 100644 index 00000000..26ed746e Binary files /dev/null and b/clock/Library/Artifacts/17/1735759485e4f1ee2aa56269ffcba793 differ diff --git a/clock/Library/Artifacts/17/175d6d12408c68656d2743051573e948 b/clock/Library/Artifacts/17/175d6d12408c68656d2743051573e948 new file mode 100644 index 00000000..0e7a730b Binary files /dev/null and b/clock/Library/Artifacts/17/175d6d12408c68656d2743051573e948 differ diff --git a/clock/Library/Artifacts/18/18086023567e5722324e120b82945614 b/clock/Library/Artifacts/18/18086023567e5722324e120b82945614 new file mode 100644 index 00000000..0d4b10c8 Binary files /dev/null and b/clock/Library/Artifacts/18/18086023567e5722324e120b82945614 differ diff --git a/clock/Library/Artifacts/18/180b1ce71a95de104d975b097e1bc9b7 b/clock/Library/Artifacts/18/180b1ce71a95de104d975b097e1bc9b7 new file mode 100644 index 00000000..5426d7c0 Binary files /dev/null and b/clock/Library/Artifacts/18/180b1ce71a95de104d975b097e1bc9b7 differ diff --git a/clock/Library/Artifacts/18/1817501b7446bdc33fb3330412edc53c b/clock/Library/Artifacts/18/1817501b7446bdc33fb3330412edc53c new file mode 100644 index 00000000..120cc904 Binary files /dev/null and b/clock/Library/Artifacts/18/1817501b7446bdc33fb3330412edc53c differ diff --git a/clock/Library/Artifacts/18/18294c0a55d51a0202468aa32ea7ed34 b/clock/Library/Artifacts/18/18294c0a55d51a0202468aa32ea7ed34 new file mode 100644 index 00000000..e67ef832 Binary files /dev/null and b/clock/Library/Artifacts/18/18294c0a55d51a0202468aa32ea7ed34 differ diff --git a/clock/Library/Artifacts/18/183a6e99acaec4f07f6fad965be9d8d2 b/clock/Library/Artifacts/18/183a6e99acaec4f07f6fad965be9d8d2 new file mode 100644 index 00000000..255a5293 Binary files /dev/null and b/clock/Library/Artifacts/18/183a6e99acaec4f07f6fad965be9d8d2 differ diff --git a/clock/Library/Artifacts/18/185e21d4ef1d9299f2f565e0dcb37b10 b/clock/Library/Artifacts/18/185e21d4ef1d9299f2f565e0dcb37b10 new file mode 100644 index 00000000..2a0584ca Binary files /dev/null and b/clock/Library/Artifacts/18/185e21d4ef1d9299f2f565e0dcb37b10 differ diff --git a/clock/Library/Artifacts/18/187295a5a3015e8af0962362e489a8eb b/clock/Library/Artifacts/18/187295a5a3015e8af0962362e489a8eb new file mode 100644 index 00000000..b84eac0c Binary files /dev/null and b/clock/Library/Artifacts/18/187295a5a3015e8af0962362e489a8eb differ diff --git a/clock/Library/Artifacts/18/18a1229885c7a0fd42b8b455ea08b172 b/clock/Library/Artifacts/18/18a1229885c7a0fd42b8b455ea08b172 new file mode 100644 index 00000000..d84d9c63 Binary files /dev/null and b/clock/Library/Artifacts/18/18a1229885c7a0fd42b8b455ea08b172 differ diff --git a/clock/Library/Artifacts/18/18a2ddee3430ad8a2d7eb8065e9fd6fd b/clock/Library/Artifacts/18/18a2ddee3430ad8a2d7eb8065e9fd6fd new file mode 100644 index 00000000..88f9892b Binary files /dev/null and b/clock/Library/Artifacts/18/18a2ddee3430ad8a2d7eb8065e9fd6fd differ diff --git a/clock/Library/Artifacts/18/18ec321032f52b82cfa79a83c65ebae9 b/clock/Library/Artifacts/18/18ec321032f52b82cfa79a83c65ebae9 new file mode 100644 index 00000000..869f3f63 Binary files /dev/null and b/clock/Library/Artifacts/18/18ec321032f52b82cfa79a83c65ebae9 differ diff --git a/clock/Library/Artifacts/19/194472a1c25c40dd55d944fee1783f06 b/clock/Library/Artifacts/19/194472a1c25c40dd55d944fee1783f06 new file mode 100644 index 00000000..13e2b402 Binary files /dev/null and b/clock/Library/Artifacts/19/194472a1c25c40dd55d944fee1783f06 differ diff --git a/clock/Library/Artifacts/19/198aead76583299617ca2ed0ad6437a9 b/clock/Library/Artifacts/19/198aead76583299617ca2ed0ad6437a9 new file mode 100644 index 00000000..c298b64d Binary files /dev/null and b/clock/Library/Artifacts/19/198aead76583299617ca2ed0ad6437a9 differ diff --git a/clock/Library/Artifacts/19/199ca0f3b16846f48cc39b34df827856 b/clock/Library/Artifacts/19/199ca0f3b16846f48cc39b34df827856 new file mode 100644 index 00000000..f9d5bc80 Binary files /dev/null and b/clock/Library/Artifacts/19/199ca0f3b16846f48cc39b34df827856 differ diff --git a/clock/Library/Artifacts/19/19a83a896ca4e31324132dee4143cce1 b/clock/Library/Artifacts/19/19a83a896ca4e31324132dee4143cce1 new file mode 100644 index 00000000..83a512b6 Binary files /dev/null and b/clock/Library/Artifacts/19/19a83a896ca4e31324132dee4143cce1 differ diff --git a/clock/Library/Artifacts/1a/1a0ba17d29566c23d48f519352f4b9cf b/clock/Library/Artifacts/1a/1a0ba17d29566c23d48f519352f4b9cf new file mode 100644 index 00000000..0fb8ec6d Binary files /dev/null and b/clock/Library/Artifacts/1a/1a0ba17d29566c23d48f519352f4b9cf differ diff --git a/clock/Library/Artifacts/1a/1a0d71c48884600bed73df03ae90e45a b/clock/Library/Artifacts/1a/1a0d71c48884600bed73df03ae90e45a new file mode 100644 index 00000000..e9b52a7d Binary files /dev/null and b/clock/Library/Artifacts/1a/1a0d71c48884600bed73df03ae90e45a differ diff --git a/clock/Library/Artifacts/1a/1aa46e17fadc0d5e182f8890520dbfef b/clock/Library/Artifacts/1a/1aa46e17fadc0d5e182f8890520dbfef new file mode 100644 index 00000000..0b8e2d1f Binary files /dev/null and b/clock/Library/Artifacts/1a/1aa46e17fadc0d5e182f8890520dbfef differ diff --git a/clock/Library/Artifacts/1a/1ad44df04d071a94c2a9f003cf11bbdc b/clock/Library/Artifacts/1a/1ad44df04d071a94c2a9f003cf11bbdc new file mode 100644 index 00000000..5816559e Binary files /dev/null and b/clock/Library/Artifacts/1a/1ad44df04d071a94c2a9f003cf11bbdc differ diff --git a/clock/Library/Artifacts/1a/1af0302089457f2023f9bd0b3b66ad51 b/clock/Library/Artifacts/1a/1af0302089457f2023f9bd0b3b66ad51 new file mode 100644 index 00000000..b628492c Binary files /dev/null and b/clock/Library/Artifacts/1a/1af0302089457f2023f9bd0b3b66ad51 differ diff --git a/clock/Library/Artifacts/1b/1b70534b77cde2a1ca8ab20b26a45d9a b/clock/Library/Artifacts/1b/1b70534b77cde2a1ca8ab20b26a45d9a new file mode 100644 index 00000000..fee2d1c3 Binary files /dev/null and b/clock/Library/Artifacts/1b/1b70534b77cde2a1ca8ab20b26a45d9a differ diff --git a/clock/Library/Artifacts/1b/1b9f6f4abc93150f7ff07755262f4366 b/clock/Library/Artifacts/1b/1b9f6f4abc93150f7ff07755262f4366 new file mode 100644 index 00000000..b1bbc14b Binary files /dev/null and b/clock/Library/Artifacts/1b/1b9f6f4abc93150f7ff07755262f4366 differ diff --git a/clock/Library/Artifacts/1b/1bd1d69d94f1f82d0e7c9e297f46eb57 b/clock/Library/Artifacts/1b/1bd1d69d94f1f82d0e7c9e297f46eb57 new file mode 100644 index 00000000..bc171879 Binary files /dev/null and b/clock/Library/Artifacts/1b/1bd1d69d94f1f82d0e7c9e297f46eb57 differ diff --git a/clock/Library/Artifacts/1b/1bdb4e6e1543e7075921a4bd20d68368 b/clock/Library/Artifacts/1b/1bdb4e6e1543e7075921a4bd20d68368 new file mode 100644 index 00000000..d6922cfe Binary files /dev/null and b/clock/Library/Artifacts/1b/1bdb4e6e1543e7075921a4bd20d68368 differ diff --git a/clock/Library/Artifacts/1c/1c28c1c3fbac55b9ff9d90dfb5ec5b3e b/clock/Library/Artifacts/1c/1c28c1c3fbac55b9ff9d90dfb5ec5b3e new file mode 100644 index 00000000..bbcb7ab7 Binary files /dev/null and b/clock/Library/Artifacts/1c/1c28c1c3fbac55b9ff9d90dfb5ec5b3e differ diff --git a/clock/Library/Artifacts/1c/1c7554b91d1a6ddd404f9a19e64fa97e b/clock/Library/Artifacts/1c/1c7554b91d1a6ddd404f9a19e64fa97e new file mode 100644 index 00000000..dcd87d7a Binary files /dev/null and b/clock/Library/Artifacts/1c/1c7554b91d1a6ddd404f9a19e64fa97e differ diff --git a/clock/Library/Artifacts/1c/1c77ea757fb7b2655dcb2571a31404c8 b/clock/Library/Artifacts/1c/1c77ea757fb7b2655dcb2571a31404c8 new file mode 100644 index 00000000..4f867c6a Binary files /dev/null and b/clock/Library/Artifacts/1c/1c77ea757fb7b2655dcb2571a31404c8 differ diff --git a/clock/Library/Artifacts/1c/1c8074bcbb0985b1c2cda0f9fb53506c b/clock/Library/Artifacts/1c/1c8074bcbb0985b1c2cda0f9fb53506c new file mode 100644 index 00000000..e4d50658 Binary files /dev/null and b/clock/Library/Artifacts/1c/1c8074bcbb0985b1c2cda0f9fb53506c differ diff --git a/clock/Library/Artifacts/1c/1c89cf069b4a006f72fc1d49ebd63325 b/clock/Library/Artifacts/1c/1c89cf069b4a006f72fc1d49ebd63325 new file mode 100644 index 00000000..e34eb87e Binary files /dev/null and b/clock/Library/Artifacts/1c/1c89cf069b4a006f72fc1d49ebd63325 differ diff --git a/clock/Library/Artifacts/1c/1ca1d13fe0073aebdff05e013f3bb96a b/clock/Library/Artifacts/1c/1ca1d13fe0073aebdff05e013f3bb96a new file mode 100644 index 00000000..02509d52 Binary files /dev/null and b/clock/Library/Artifacts/1c/1ca1d13fe0073aebdff05e013f3bb96a differ diff --git a/clock/Library/Artifacts/1d/1d620927f522cac854f0e92ab61b32b9 b/clock/Library/Artifacts/1d/1d620927f522cac854f0e92ab61b32b9 new file mode 100644 index 00000000..f1bbce27 Binary files /dev/null and b/clock/Library/Artifacts/1d/1d620927f522cac854f0e92ab61b32b9 differ diff --git a/clock/Library/Artifacts/1d/1d70809507b079ca1a60800121871978 b/clock/Library/Artifacts/1d/1d70809507b079ca1a60800121871978 new file mode 100644 index 00000000..376bf015 Binary files /dev/null and b/clock/Library/Artifacts/1d/1d70809507b079ca1a60800121871978 differ diff --git a/clock/Library/Artifacts/1d/1d73fbcf57c566a079e68cde58292356 b/clock/Library/Artifacts/1d/1d73fbcf57c566a079e68cde58292356 new file mode 100644 index 00000000..89b71e9d Binary files /dev/null and b/clock/Library/Artifacts/1d/1d73fbcf57c566a079e68cde58292356 differ diff --git a/clock/Library/Artifacts/1d/1d7b4c73e12d84249cac4ee531e0b9fc b/clock/Library/Artifacts/1d/1d7b4c73e12d84249cac4ee531e0b9fc new file mode 100644 index 00000000..39d82057 Binary files /dev/null and b/clock/Library/Artifacts/1d/1d7b4c73e12d84249cac4ee531e0b9fc differ diff --git a/clock/Library/Artifacts/1d/1da38abac07cf301d69fbcd4ef897154 b/clock/Library/Artifacts/1d/1da38abac07cf301d69fbcd4ef897154 new file mode 100644 index 00000000..477987f8 Binary files /dev/null and b/clock/Library/Artifacts/1d/1da38abac07cf301d69fbcd4ef897154 differ diff --git a/clock/Library/Artifacts/1d/1de643b3cff993daae626fea8bf21812 b/clock/Library/Artifacts/1d/1de643b3cff993daae626fea8bf21812 new file mode 100644 index 00000000..b1ff76c4 Binary files /dev/null and b/clock/Library/Artifacts/1d/1de643b3cff993daae626fea8bf21812 differ diff --git a/clock/Library/Artifacts/1e/1e175f3d9858d39880fdc5c8ac882ffe b/clock/Library/Artifacts/1e/1e175f3d9858d39880fdc5c8ac882ffe new file mode 100644 index 00000000..aab9ef38 Binary files /dev/null and b/clock/Library/Artifacts/1e/1e175f3d9858d39880fdc5c8ac882ffe differ diff --git a/clock/Library/Artifacts/1e/1e314a8e14b09644c88fa2d5bfcc19a6 b/clock/Library/Artifacts/1e/1e314a8e14b09644c88fa2d5bfcc19a6 new file mode 100644 index 00000000..c96d6711 Binary files /dev/null and b/clock/Library/Artifacts/1e/1e314a8e14b09644c88fa2d5bfcc19a6 differ diff --git a/clock/Library/Artifacts/1e/1e55671f27bd2b7596fca30c5c30c0ca b/clock/Library/Artifacts/1e/1e55671f27bd2b7596fca30c5c30c0ca new file mode 100644 index 00000000..1339c75c Binary files /dev/null and b/clock/Library/Artifacts/1e/1e55671f27bd2b7596fca30c5c30c0ca differ diff --git a/clock/Library/Artifacts/1e/1e7da4dd85de648c06432f73a89d4b42 b/clock/Library/Artifacts/1e/1e7da4dd85de648c06432f73a89d4b42 new file mode 100644 index 00000000..dc515926 Binary files /dev/null and b/clock/Library/Artifacts/1e/1e7da4dd85de648c06432f73a89d4b42 differ diff --git a/clock/Library/Artifacts/1e/1ee6bb140b80466f0cb435a773903fca b/clock/Library/Artifacts/1e/1ee6bb140b80466f0cb435a773903fca new file mode 100644 index 00000000..6a8eb993 Binary files /dev/null and b/clock/Library/Artifacts/1e/1ee6bb140b80466f0cb435a773903fca differ diff --git a/clock/Library/Artifacts/1f/1f0f48dc7029cfefcb0c7e0a67ba4c42 b/clock/Library/Artifacts/1f/1f0f48dc7029cfefcb0c7e0a67ba4c42 new file mode 100644 index 00000000..058d5e0e Binary files /dev/null and b/clock/Library/Artifacts/1f/1f0f48dc7029cfefcb0c7e0a67ba4c42 differ diff --git a/clock/Library/Artifacts/1f/1f4e718f61a6505c30f6048a62ce858d b/clock/Library/Artifacts/1f/1f4e718f61a6505c30f6048a62ce858d new file mode 100644 index 00000000..f13fb7e9 Binary files /dev/null and b/clock/Library/Artifacts/1f/1f4e718f61a6505c30f6048a62ce858d differ diff --git a/clock/Library/Artifacts/1f/1f528dae5e2d35400ed71457b28979d9 b/clock/Library/Artifacts/1f/1f528dae5e2d35400ed71457b28979d9 new file mode 100644 index 00000000..e04af5a8 Binary files /dev/null and b/clock/Library/Artifacts/1f/1f528dae5e2d35400ed71457b28979d9 differ diff --git a/clock/Library/Artifacts/1f/1f8a70e90e29997cf6191a37efe2bf5e b/clock/Library/Artifacts/1f/1f8a70e90e29997cf6191a37efe2bf5e new file mode 100644 index 00000000..c69ad12a Binary files /dev/null and b/clock/Library/Artifacts/1f/1f8a70e90e29997cf6191a37efe2bf5e differ diff --git a/clock/Library/Artifacts/1f/1fbc0c32e612c6970041c2661d50a9bf b/clock/Library/Artifacts/1f/1fbc0c32e612c6970041c2661d50a9bf new file mode 100644 index 00000000..6ffb7938 Binary files /dev/null and b/clock/Library/Artifacts/1f/1fbc0c32e612c6970041c2661d50a9bf differ diff --git a/clock/Library/Artifacts/1f/1fc9aaaab9e6128ac7e3460320ef5a11 b/clock/Library/Artifacts/1f/1fc9aaaab9e6128ac7e3460320ef5a11 new file mode 100644 index 00000000..7f887e3e Binary files /dev/null and b/clock/Library/Artifacts/1f/1fc9aaaab9e6128ac7e3460320ef5a11 differ diff --git a/clock/Library/Artifacts/1f/1fec442c704ddf090ea5398d42d9df79 b/clock/Library/Artifacts/1f/1fec442c704ddf090ea5398d42d9df79 new file mode 100644 index 00000000..67ce8ddd Binary files /dev/null and b/clock/Library/Artifacts/1f/1fec442c704ddf090ea5398d42d9df79 differ diff --git a/clock/Library/Artifacts/20/20099236645d99de443781caf2481591 b/clock/Library/Artifacts/20/20099236645d99de443781caf2481591 new file mode 100644 index 00000000..390a5923 Binary files /dev/null and b/clock/Library/Artifacts/20/20099236645d99de443781caf2481591 differ diff --git a/clock/Library/Artifacts/20/2046205af6c0e70ee5994fa1980005e5 b/clock/Library/Artifacts/20/2046205af6c0e70ee5994fa1980005e5 new file mode 100644 index 00000000..fc43f58b Binary files /dev/null and b/clock/Library/Artifacts/20/2046205af6c0e70ee5994fa1980005e5 differ diff --git a/clock/Library/Artifacts/20/204cc197d17e7c7c6c338fa21ee90b95 b/clock/Library/Artifacts/20/204cc197d17e7c7c6c338fa21ee90b95 new file mode 100644 index 00000000..1bd2aca5 Binary files /dev/null and b/clock/Library/Artifacts/20/204cc197d17e7c7c6c338fa21ee90b95 differ diff --git a/clock/Library/Artifacts/20/2058eeef467f34bd2d7100670f1e7380 b/clock/Library/Artifacts/20/2058eeef467f34bd2d7100670f1e7380 new file mode 100644 index 00000000..65b5cd97 Binary files /dev/null and b/clock/Library/Artifacts/20/2058eeef467f34bd2d7100670f1e7380 differ diff --git a/clock/Library/Artifacts/20/205a10bf4c16faf67a75f1e219719058 b/clock/Library/Artifacts/20/205a10bf4c16faf67a75f1e219719058 new file mode 100644 index 00000000..8f4e4bd7 Binary files /dev/null and b/clock/Library/Artifacts/20/205a10bf4c16faf67a75f1e219719058 differ diff --git a/clock/Library/Artifacts/20/208dd7968a526a24bc8daa6c9815d732 b/clock/Library/Artifacts/20/208dd7968a526a24bc8daa6c9815d732 new file mode 100644 index 00000000..e931ea7e Binary files /dev/null and b/clock/Library/Artifacts/20/208dd7968a526a24bc8daa6c9815d732 differ diff --git a/clock/Library/Artifacts/21/2144f09af23119a90f7b00b20de35c46 b/clock/Library/Artifacts/21/2144f09af23119a90f7b00b20de35c46 new file mode 100644 index 00000000..1a4ef671 Binary files /dev/null and b/clock/Library/Artifacts/21/2144f09af23119a90f7b00b20de35c46 differ diff --git a/clock/Library/Artifacts/21/218b4ab5ad84f6287d370def3e2ded8e b/clock/Library/Artifacts/21/218b4ab5ad84f6287d370def3e2ded8e new file mode 100644 index 00000000..131dd5ec Binary files /dev/null and b/clock/Library/Artifacts/21/218b4ab5ad84f6287d370def3e2ded8e differ diff --git a/clock/Library/Artifacts/21/21902e1fcc4b470f4582a34fcfc01e5a b/clock/Library/Artifacts/21/21902e1fcc4b470f4582a34fcfc01e5a new file mode 100644 index 00000000..16f678a2 Binary files /dev/null and b/clock/Library/Artifacts/21/21902e1fcc4b470f4582a34fcfc01e5a differ diff --git a/clock/Library/Artifacts/21/21b6c3ea8ef6400a9aff3cae5a038c7a b/clock/Library/Artifacts/21/21b6c3ea8ef6400a9aff3cae5a038c7a new file mode 100644 index 00000000..eb483e36 Binary files /dev/null and b/clock/Library/Artifacts/21/21b6c3ea8ef6400a9aff3cae5a038c7a differ diff --git a/clock/Library/Artifacts/21/21b7810d6dd8607d976344eb42e0df51 b/clock/Library/Artifacts/21/21b7810d6dd8607d976344eb42e0df51 new file mode 100644 index 00000000..ef041664 Binary files /dev/null and b/clock/Library/Artifacts/21/21b7810d6dd8607d976344eb42e0df51 differ diff --git a/clock/Library/Artifacts/21/21cd6a6d0a86f4f1cfcd95f65e8847dc b/clock/Library/Artifacts/21/21cd6a6d0a86f4f1cfcd95f65e8847dc new file mode 100644 index 00000000..c837c294 Binary files /dev/null and b/clock/Library/Artifacts/21/21cd6a6d0a86f4f1cfcd95f65e8847dc differ diff --git a/clock/Library/Artifacts/21/21d973059dd4e597fd765a9bf1fe8231 b/clock/Library/Artifacts/21/21d973059dd4e597fd765a9bf1fe8231 new file mode 100644 index 00000000..444700d9 Binary files /dev/null and b/clock/Library/Artifacts/21/21d973059dd4e597fd765a9bf1fe8231 differ diff --git a/clock/Library/Artifacts/21/21ef2de56989fc0c4acc14d850c90a43 b/clock/Library/Artifacts/21/21ef2de56989fc0c4acc14d850c90a43 new file mode 100644 index 00000000..eeb67cab Binary files /dev/null and b/clock/Library/Artifacts/21/21ef2de56989fc0c4acc14d850c90a43 differ diff --git a/clock/Library/Artifacts/22/22398d5da1c8b80ceea13fc64161f9f4 b/clock/Library/Artifacts/22/22398d5da1c8b80ceea13fc64161f9f4 new file mode 100644 index 00000000..b5345ea9 Binary files /dev/null and b/clock/Library/Artifacts/22/22398d5da1c8b80ceea13fc64161f9f4 differ diff --git a/clock/Library/Artifacts/22/2257e893ee1b5a32a1d9e53d1d3fad1b b/clock/Library/Artifacts/22/2257e893ee1b5a32a1d9e53d1d3fad1b new file mode 100644 index 00000000..6fe3cd2e Binary files /dev/null and b/clock/Library/Artifacts/22/2257e893ee1b5a32a1d9e53d1d3fad1b differ diff --git a/clock/Library/Artifacts/22/22a49bd5f164c88920e3c573b76e3d1b b/clock/Library/Artifacts/22/22a49bd5f164c88920e3c573b76e3d1b new file mode 100644 index 00000000..74ab2285 Binary files /dev/null and b/clock/Library/Artifacts/22/22a49bd5f164c88920e3c573b76e3d1b differ diff --git a/clock/Library/Artifacts/22/22e5367043611e2acf85b1ef6fd3a05a b/clock/Library/Artifacts/22/22e5367043611e2acf85b1ef6fd3a05a new file mode 100644 index 00000000..d191608a Binary files /dev/null and b/clock/Library/Artifacts/22/22e5367043611e2acf85b1ef6fd3a05a differ diff --git a/clock/Library/Artifacts/23/231874c0febd0ee262a57701ab31473b b/clock/Library/Artifacts/23/231874c0febd0ee262a57701ab31473b new file mode 100644 index 00000000..3b916c8f Binary files /dev/null and b/clock/Library/Artifacts/23/231874c0febd0ee262a57701ab31473b differ diff --git a/clock/Library/Artifacts/23/2327f9353cd40a7cbd05420fc4a90bf3 b/clock/Library/Artifacts/23/2327f9353cd40a7cbd05420fc4a90bf3 new file mode 100644 index 00000000..81fd4109 Binary files /dev/null and b/clock/Library/Artifacts/23/2327f9353cd40a7cbd05420fc4a90bf3 differ diff --git a/clock/Library/Artifacts/23/233fcbcbd1d45b45c2f45aa55339f038 b/clock/Library/Artifacts/23/233fcbcbd1d45b45c2f45aa55339f038 new file mode 100644 index 00000000..87083508 Binary files /dev/null and b/clock/Library/Artifacts/23/233fcbcbd1d45b45c2f45aa55339f038 differ diff --git a/clock/Library/Artifacts/23/238567bd2aa8a6476db915795bada128 b/clock/Library/Artifacts/23/238567bd2aa8a6476db915795bada128 new file mode 100644 index 00000000..dd124e63 Binary files /dev/null and b/clock/Library/Artifacts/23/238567bd2aa8a6476db915795bada128 differ diff --git a/clock/Library/Artifacts/23/2392602aba3da6506efcfd85739642e0 b/clock/Library/Artifacts/23/2392602aba3da6506efcfd85739642e0 new file mode 100644 index 00000000..2a47172c Binary files /dev/null and b/clock/Library/Artifacts/23/2392602aba3da6506efcfd85739642e0 differ diff --git a/clock/Library/Artifacts/23/239a01efe7d67b4354bec5cc4327d0e0 b/clock/Library/Artifacts/23/239a01efe7d67b4354bec5cc4327d0e0 new file mode 100644 index 00000000..5bab5fd2 Binary files /dev/null and b/clock/Library/Artifacts/23/239a01efe7d67b4354bec5cc4327d0e0 differ diff --git a/clock/Library/Artifacts/23/23cc9309913cea53ec2c59896a808be1 b/clock/Library/Artifacts/23/23cc9309913cea53ec2c59896a808be1 new file mode 100644 index 00000000..b9c163c4 Binary files /dev/null and b/clock/Library/Artifacts/23/23cc9309913cea53ec2c59896a808be1 differ diff --git a/clock/Library/Artifacts/23/23d75fd9c2bee2828427f0ce1eae246d b/clock/Library/Artifacts/23/23d75fd9c2bee2828427f0ce1eae246d new file mode 100644 index 00000000..6ba4fde6 Binary files /dev/null and b/clock/Library/Artifacts/23/23d75fd9c2bee2828427f0ce1eae246d differ diff --git a/clock/Library/Artifacts/24/2403f0d0d1a1b370abc990eb1418efa7 b/clock/Library/Artifacts/24/2403f0d0d1a1b370abc990eb1418efa7 new file mode 100644 index 00000000..2ad9c975 Binary files /dev/null and b/clock/Library/Artifacts/24/2403f0d0d1a1b370abc990eb1418efa7 differ diff --git a/clock/Library/Artifacts/24/2405489ee7bd0c3c05ae039a8f3762ec b/clock/Library/Artifacts/24/2405489ee7bd0c3c05ae039a8f3762ec new file mode 100644 index 00000000..4df266d6 Binary files /dev/null and b/clock/Library/Artifacts/24/2405489ee7bd0c3c05ae039a8f3762ec differ diff --git a/clock/Library/Artifacts/24/24131a354367260c3b62e120effa1209 b/clock/Library/Artifacts/24/24131a354367260c3b62e120effa1209 new file mode 100644 index 00000000..e1a0ce7c Binary files /dev/null and b/clock/Library/Artifacts/24/24131a354367260c3b62e120effa1209 differ diff --git a/clock/Library/Artifacts/24/2430babd669e12f4e03460efcae83582 b/clock/Library/Artifacts/24/2430babd669e12f4e03460efcae83582 new file mode 100644 index 00000000..bae74093 Binary files /dev/null and b/clock/Library/Artifacts/24/2430babd669e12f4e03460efcae83582 differ diff --git a/clock/Library/Artifacts/24/243d8d72e2b846590cf1ea87528ad36e b/clock/Library/Artifacts/24/243d8d72e2b846590cf1ea87528ad36e new file mode 100644 index 00000000..802a68a1 Binary files /dev/null and b/clock/Library/Artifacts/24/243d8d72e2b846590cf1ea87528ad36e differ diff --git a/clock/Library/Artifacts/24/243e442f6bcdd55694b27f37a846afa2 b/clock/Library/Artifacts/24/243e442f6bcdd55694b27f37a846afa2 new file mode 100644 index 00000000..82253770 Binary files /dev/null and b/clock/Library/Artifacts/24/243e442f6bcdd55694b27f37a846afa2 differ diff --git a/clock/Library/Artifacts/24/24648ff130fbd05bfb840c5a99957ace b/clock/Library/Artifacts/24/24648ff130fbd05bfb840c5a99957ace new file mode 100644 index 00000000..9f489fa2 Binary files /dev/null and b/clock/Library/Artifacts/24/24648ff130fbd05bfb840c5a99957ace differ diff --git a/clock/Library/Artifacts/24/2476cd131fd2cdabe134a864a62ca1a1 b/clock/Library/Artifacts/24/2476cd131fd2cdabe134a864a62ca1a1 new file mode 100644 index 00000000..84f72669 Binary files /dev/null and b/clock/Library/Artifacts/24/2476cd131fd2cdabe134a864a62ca1a1 differ diff --git a/clock/Library/Artifacts/24/2479c100cd690adeb2a9787f88a3feba b/clock/Library/Artifacts/24/2479c100cd690adeb2a9787f88a3feba new file mode 100644 index 00000000..158a12ab Binary files /dev/null and b/clock/Library/Artifacts/24/2479c100cd690adeb2a9787f88a3feba differ diff --git a/clock/Library/Artifacts/24/24c39e75cefd8d9c29580b19a3d0125a b/clock/Library/Artifacts/24/24c39e75cefd8d9c29580b19a3d0125a new file mode 100644 index 00000000..2287a117 Binary files /dev/null and b/clock/Library/Artifacts/24/24c39e75cefd8d9c29580b19a3d0125a differ diff --git a/clock/Library/Artifacts/24/24e47df5cd5a2323d99db8299baa8135 b/clock/Library/Artifacts/24/24e47df5cd5a2323d99db8299baa8135 new file mode 100644 index 00000000..a66a85bc Binary files /dev/null and b/clock/Library/Artifacts/24/24e47df5cd5a2323d99db8299baa8135 differ diff --git a/clock/Library/Artifacts/25/2505c149a7d007406e5891f5c5f75789 b/clock/Library/Artifacts/25/2505c149a7d007406e5891f5c5f75789 new file mode 100644 index 00000000..d2f6fa07 Binary files /dev/null and b/clock/Library/Artifacts/25/2505c149a7d007406e5891f5c5f75789 differ diff --git a/clock/Library/Artifacts/25/251d0e9e7a5615f04c2d357f34322eea b/clock/Library/Artifacts/25/251d0e9e7a5615f04c2d357f34322eea new file mode 100644 index 00000000..b1013259 Binary files /dev/null and b/clock/Library/Artifacts/25/251d0e9e7a5615f04c2d357f34322eea differ diff --git a/clock/Library/Artifacts/25/25263f9263224616e51bb7e4257b5d31 b/clock/Library/Artifacts/25/25263f9263224616e51bb7e4257b5d31 new file mode 100644 index 00000000..e45aa6b4 Binary files /dev/null and b/clock/Library/Artifacts/25/25263f9263224616e51bb7e4257b5d31 differ diff --git a/clock/Library/Artifacts/25/253623650b36ff8d71ed3324171289a2 b/clock/Library/Artifacts/25/253623650b36ff8d71ed3324171289a2 new file mode 100644 index 00000000..2ea46f51 Binary files /dev/null and b/clock/Library/Artifacts/25/253623650b36ff8d71ed3324171289a2 differ diff --git a/clock/Library/Artifacts/25/25c7754745f8a9ec364033c5dee21193 b/clock/Library/Artifacts/25/25c7754745f8a9ec364033c5dee21193 new file mode 100644 index 00000000..22da2455 Binary files /dev/null and b/clock/Library/Artifacts/25/25c7754745f8a9ec364033c5dee21193 differ diff --git a/clock/Library/Artifacts/26/2602cd116610829e5353ac261741fc6e b/clock/Library/Artifacts/26/2602cd116610829e5353ac261741fc6e new file mode 100644 index 00000000..f09da1b7 Binary files /dev/null and b/clock/Library/Artifacts/26/2602cd116610829e5353ac261741fc6e differ diff --git a/clock/Library/Artifacts/26/261914f9621de6aaf151657e676b6f58 b/clock/Library/Artifacts/26/261914f9621de6aaf151657e676b6f58 new file mode 100644 index 00000000..2882ac66 Binary files /dev/null and b/clock/Library/Artifacts/26/261914f9621de6aaf151657e676b6f58 differ diff --git a/clock/Library/Artifacts/26/2628688eb85ef2058da67257a75b4981 b/clock/Library/Artifacts/26/2628688eb85ef2058da67257a75b4981 new file mode 100644 index 00000000..5c2fb6c6 Binary files /dev/null and b/clock/Library/Artifacts/26/2628688eb85ef2058da67257a75b4981 differ diff --git a/clock/Library/Artifacts/26/263d3983c8148c2f31dfff27c7e188f9 b/clock/Library/Artifacts/26/263d3983c8148c2f31dfff27c7e188f9 new file mode 100644 index 00000000..09e1c7d7 Binary files /dev/null and b/clock/Library/Artifacts/26/263d3983c8148c2f31dfff27c7e188f9 differ diff --git a/clock/Library/Artifacts/26/266c836e22819928c0eb8a629b61e946 b/clock/Library/Artifacts/26/266c836e22819928c0eb8a629b61e946 new file mode 100644 index 00000000..7a62ef3c Binary files /dev/null and b/clock/Library/Artifacts/26/266c836e22819928c0eb8a629b61e946 differ diff --git a/clock/Library/Artifacts/26/268328f517433959d1314b180697eb04 b/clock/Library/Artifacts/26/268328f517433959d1314b180697eb04 new file mode 100644 index 00000000..745910e9 Binary files /dev/null and b/clock/Library/Artifacts/26/268328f517433959d1314b180697eb04 differ diff --git a/clock/Library/Artifacts/26/26b98171b08716b37841b4608bbf0639 b/clock/Library/Artifacts/26/26b98171b08716b37841b4608bbf0639 new file mode 100644 index 00000000..1b7a870f Binary files /dev/null and b/clock/Library/Artifacts/26/26b98171b08716b37841b4608bbf0639 differ diff --git a/clock/Library/Artifacts/26/26f2d420f1fb2c1d93d7f9f5d2e6252c b/clock/Library/Artifacts/26/26f2d420f1fb2c1d93d7f9f5d2e6252c new file mode 100644 index 00000000..5a4d0049 Binary files /dev/null and b/clock/Library/Artifacts/26/26f2d420f1fb2c1d93d7f9f5d2e6252c differ diff --git a/clock/Library/Artifacts/27/27453a25ed54b38154336812d3ab3e9d b/clock/Library/Artifacts/27/27453a25ed54b38154336812d3ab3e9d new file mode 100644 index 00000000..292c9704 Binary files /dev/null and b/clock/Library/Artifacts/27/27453a25ed54b38154336812d3ab3e9d differ diff --git a/clock/Library/Artifacts/27/274d349d86dec460404964fc672cc6cd b/clock/Library/Artifacts/27/274d349d86dec460404964fc672cc6cd new file mode 100644 index 00000000..82ae5eed Binary files /dev/null and b/clock/Library/Artifacts/27/274d349d86dec460404964fc672cc6cd differ diff --git a/clock/Library/Artifacts/27/2754cca6cc4b80e84e0effe732e55527 b/clock/Library/Artifacts/27/2754cca6cc4b80e84e0effe732e55527 new file mode 100644 index 00000000..2e74ad28 Binary files /dev/null and b/clock/Library/Artifacts/27/2754cca6cc4b80e84e0effe732e55527 differ diff --git a/clock/Library/Artifacts/27/275d94ec9e558c85b33943818c0e973d b/clock/Library/Artifacts/27/275d94ec9e558c85b33943818c0e973d new file mode 100644 index 00000000..ab56be24 Binary files /dev/null and b/clock/Library/Artifacts/27/275d94ec9e558c85b33943818c0e973d differ diff --git a/clock/Library/Artifacts/27/27a0187700e8837a4624dd4af68fd06e b/clock/Library/Artifacts/27/27a0187700e8837a4624dd4af68fd06e new file mode 100644 index 00000000..8388eda6 Binary files /dev/null and b/clock/Library/Artifacts/27/27a0187700e8837a4624dd4af68fd06e differ diff --git a/clock/Library/Artifacts/27/27e81783c16c0c1ac09e010bcdda548a b/clock/Library/Artifacts/27/27e81783c16c0c1ac09e010bcdda548a new file mode 100644 index 00000000..df7f7c17 Binary files /dev/null and b/clock/Library/Artifacts/27/27e81783c16c0c1ac09e010bcdda548a differ diff --git a/clock/Library/Artifacts/28/280fe8ba7c2018ff20d6a5adbd8c76b4 b/clock/Library/Artifacts/28/280fe8ba7c2018ff20d6a5adbd8c76b4 new file mode 100644 index 00000000..f6eb34d7 Binary files /dev/null and b/clock/Library/Artifacts/28/280fe8ba7c2018ff20d6a5adbd8c76b4 differ diff --git a/clock/Library/Artifacts/28/283cc5f85fc2e6732dfd483e568aa402 b/clock/Library/Artifacts/28/283cc5f85fc2e6732dfd483e568aa402 new file mode 100644 index 00000000..3397b5f3 Binary files /dev/null and b/clock/Library/Artifacts/28/283cc5f85fc2e6732dfd483e568aa402 differ diff --git a/clock/Library/Artifacts/28/2849c413ebc05ac06bfa064986877869 b/clock/Library/Artifacts/28/2849c413ebc05ac06bfa064986877869 new file mode 100644 index 00000000..bd8cbf8f Binary files /dev/null and b/clock/Library/Artifacts/28/2849c413ebc05ac06bfa064986877869 differ diff --git a/clock/Library/Artifacts/28/287421c7271089cf5faf5f0d120f2a3c b/clock/Library/Artifacts/28/287421c7271089cf5faf5f0d120f2a3c new file mode 100644 index 00000000..4f4263c9 Binary files /dev/null and b/clock/Library/Artifacts/28/287421c7271089cf5faf5f0d120f2a3c differ diff --git a/clock/Library/Artifacts/28/287b4a4aa3c43be25212c84b7ecd062b b/clock/Library/Artifacts/28/287b4a4aa3c43be25212c84b7ecd062b new file mode 100644 index 00000000..9e146e4d Binary files /dev/null and b/clock/Library/Artifacts/28/287b4a4aa3c43be25212c84b7ecd062b differ diff --git a/clock/Library/Artifacts/28/287f4640b574949f13a945bc19d2ae37 b/clock/Library/Artifacts/28/287f4640b574949f13a945bc19d2ae37 new file mode 100644 index 00000000..6a7d991a Binary files /dev/null and b/clock/Library/Artifacts/28/287f4640b574949f13a945bc19d2ae37 differ diff --git a/clock/Library/Artifacts/28/28b61b169a7b3ac87314a34c151d8f28 b/clock/Library/Artifacts/28/28b61b169a7b3ac87314a34c151d8f28 new file mode 100644 index 00000000..4aaaa06a Binary files /dev/null and b/clock/Library/Artifacts/28/28b61b169a7b3ac87314a34c151d8f28 differ diff --git a/clock/Library/Artifacts/28/28bc4633d951de29c1456d14370f931f b/clock/Library/Artifacts/28/28bc4633d951de29c1456d14370f931f new file mode 100644 index 00000000..18735c70 Binary files /dev/null and b/clock/Library/Artifacts/28/28bc4633d951de29c1456d14370f931f differ diff --git a/clock/Library/Artifacts/28/28c6c161605f746c4ea420bfbd1f9c63 b/clock/Library/Artifacts/28/28c6c161605f746c4ea420bfbd1f9c63 new file mode 100644 index 00000000..62c6fc46 Binary files /dev/null and b/clock/Library/Artifacts/28/28c6c161605f746c4ea420bfbd1f9c63 differ diff --git a/clock/Library/Artifacts/28/28f3f2590854b1e66d0937b2340e9467 b/clock/Library/Artifacts/28/28f3f2590854b1e66d0937b2340e9467 new file mode 100644 index 00000000..49bca760 Binary files /dev/null and b/clock/Library/Artifacts/28/28f3f2590854b1e66d0937b2340e9467 differ diff --git a/clock/Library/Artifacts/28/28f76cfdb3519a60994e5f38aadb27ad b/clock/Library/Artifacts/28/28f76cfdb3519a60994e5f38aadb27ad new file mode 100644 index 00000000..9586bf0e Binary files /dev/null and b/clock/Library/Artifacts/28/28f76cfdb3519a60994e5f38aadb27ad differ diff --git a/clock/Library/Artifacts/29/297441dafb39ca3c1c28910e6bc1e37d b/clock/Library/Artifacts/29/297441dafb39ca3c1c28910e6bc1e37d new file mode 100644 index 00000000..c56dbcd1 Binary files /dev/null and b/clock/Library/Artifacts/29/297441dafb39ca3c1c28910e6bc1e37d differ diff --git a/clock/Library/Artifacts/29/298174bbe26882c2742b3ef9bce4e3eb b/clock/Library/Artifacts/29/298174bbe26882c2742b3ef9bce4e3eb new file mode 100644 index 00000000..6c5de40a Binary files /dev/null and b/clock/Library/Artifacts/29/298174bbe26882c2742b3ef9bce4e3eb differ diff --git a/clock/Library/Artifacts/29/29f60ccc8b07aeee34412745ada7b49c b/clock/Library/Artifacts/29/29f60ccc8b07aeee34412745ada7b49c new file mode 100644 index 00000000..6517a960 Binary files /dev/null and b/clock/Library/Artifacts/29/29f60ccc8b07aeee34412745ada7b49c differ diff --git a/clock/Library/Artifacts/29/29f9bd2bb801de28c243009b8d59e3e3 b/clock/Library/Artifacts/29/29f9bd2bb801de28c243009b8d59e3e3 new file mode 100644 index 00000000..83f74e92 Binary files /dev/null and b/clock/Library/Artifacts/29/29f9bd2bb801de28c243009b8d59e3e3 differ diff --git a/clock/Library/Artifacts/2a/2a4fc6e71962a80af60e19ab02c21e05 b/clock/Library/Artifacts/2a/2a4fc6e71962a80af60e19ab02c21e05 new file mode 100644 index 00000000..b70fff49 Binary files /dev/null and b/clock/Library/Artifacts/2a/2a4fc6e71962a80af60e19ab02c21e05 differ diff --git a/clock/Library/Artifacts/2a/2acc6ac66550b846f86493d32b4d46ec b/clock/Library/Artifacts/2a/2acc6ac66550b846f86493d32b4d46ec new file mode 100644 index 00000000..0ed50252 Binary files /dev/null and b/clock/Library/Artifacts/2a/2acc6ac66550b846f86493d32b4d46ec differ diff --git a/clock/Library/Artifacts/2b/2b188fda1a4bd1d5b1834eb7925d464a b/clock/Library/Artifacts/2b/2b188fda1a4bd1d5b1834eb7925d464a new file mode 100644 index 00000000..3c49aab6 Binary files /dev/null and b/clock/Library/Artifacts/2b/2b188fda1a4bd1d5b1834eb7925d464a differ diff --git a/clock/Library/Artifacts/2b/2bc85fd9f4243eeb03c9cb4746c6108f b/clock/Library/Artifacts/2b/2bc85fd9f4243eeb03c9cb4746c6108f new file mode 100644 index 00000000..f637e46e Binary files /dev/null and b/clock/Library/Artifacts/2b/2bc85fd9f4243eeb03c9cb4746c6108f differ diff --git a/clock/Library/Artifacts/2c/2c16227aa1f646ba3dbb8e586f7b72c9 b/clock/Library/Artifacts/2c/2c16227aa1f646ba3dbb8e586f7b72c9 new file mode 100644 index 00000000..d1cfbcec Binary files /dev/null and b/clock/Library/Artifacts/2c/2c16227aa1f646ba3dbb8e586f7b72c9 differ diff --git a/clock/Library/Artifacts/2c/2c3d2c1a83ebe964ba3b963cf3005e75 b/clock/Library/Artifacts/2c/2c3d2c1a83ebe964ba3b963cf3005e75 new file mode 100644 index 00000000..44c966eb Binary files /dev/null and b/clock/Library/Artifacts/2c/2c3d2c1a83ebe964ba3b963cf3005e75 differ diff --git a/clock/Library/Artifacts/2c/2c8944d64332c3f0784f9fc57782476a b/clock/Library/Artifacts/2c/2c8944d64332c3f0784f9fc57782476a new file mode 100644 index 00000000..059452c4 Binary files /dev/null and b/clock/Library/Artifacts/2c/2c8944d64332c3f0784f9fc57782476a differ diff --git a/clock/Library/Artifacts/2c/2c9b8c9dce0d4675eac54e96cafc3062 b/clock/Library/Artifacts/2c/2c9b8c9dce0d4675eac54e96cafc3062 new file mode 100644 index 00000000..1840aecc Binary files /dev/null and b/clock/Library/Artifacts/2c/2c9b8c9dce0d4675eac54e96cafc3062 differ diff --git a/clock/Library/Artifacts/2c/2c9ebd751bbbdff635b8287399cdad1f b/clock/Library/Artifacts/2c/2c9ebd751bbbdff635b8287399cdad1f new file mode 100644 index 00000000..b2e7419a Binary files /dev/null and b/clock/Library/Artifacts/2c/2c9ebd751bbbdff635b8287399cdad1f differ diff --git a/clock/Library/Artifacts/2c/2ca277488e2619741191fa5b10e2ab24 b/clock/Library/Artifacts/2c/2ca277488e2619741191fa5b10e2ab24 new file mode 100644 index 00000000..01d96f69 Binary files /dev/null and b/clock/Library/Artifacts/2c/2ca277488e2619741191fa5b10e2ab24 differ diff --git a/clock/Library/Artifacts/2c/2cad4e095ff04101a659337545070989 b/clock/Library/Artifacts/2c/2cad4e095ff04101a659337545070989 new file mode 100644 index 00000000..edfaa2f7 Binary files /dev/null and b/clock/Library/Artifacts/2c/2cad4e095ff04101a659337545070989 differ diff --git a/clock/Library/Artifacts/2c/2cc69b248a5536ab08f7dcb8ee07b3f0 b/clock/Library/Artifacts/2c/2cc69b248a5536ab08f7dcb8ee07b3f0 new file mode 100644 index 00000000..66166923 Binary files /dev/null and b/clock/Library/Artifacts/2c/2cc69b248a5536ab08f7dcb8ee07b3f0 differ diff --git a/clock/Library/Artifacts/2c/2cd02f68aa0f3eb2788c465c6ab490f0 b/clock/Library/Artifacts/2c/2cd02f68aa0f3eb2788c465c6ab490f0 new file mode 100644 index 00000000..d8a79492 Binary files /dev/null and b/clock/Library/Artifacts/2c/2cd02f68aa0f3eb2788c465c6ab490f0 differ diff --git a/clock/Library/Artifacts/2d/2d24ff0caeeeb46a1df40d9ad81b0c15 b/clock/Library/Artifacts/2d/2d24ff0caeeeb46a1df40d9ad81b0c15 new file mode 100644 index 00000000..d90fa4b9 Binary files /dev/null and b/clock/Library/Artifacts/2d/2d24ff0caeeeb46a1df40d9ad81b0c15 differ diff --git a/clock/Library/Artifacts/2d/2d3e24ba4d1f3c0c4b050048a26757df b/clock/Library/Artifacts/2d/2d3e24ba4d1f3c0c4b050048a26757df new file mode 100644 index 00000000..115f63ed Binary files /dev/null and b/clock/Library/Artifacts/2d/2d3e24ba4d1f3c0c4b050048a26757df differ diff --git a/clock/Library/Artifacts/2d/2d5026d7847095f27b0fd7870062e6e8 b/clock/Library/Artifacts/2d/2d5026d7847095f27b0fd7870062e6e8 new file mode 100644 index 00000000..765fbf59 Binary files /dev/null and b/clock/Library/Artifacts/2d/2d5026d7847095f27b0fd7870062e6e8 differ diff --git a/clock/Library/Artifacts/2d/2df85a75e73ada62d1a2fa9b6fb7180a b/clock/Library/Artifacts/2d/2df85a75e73ada62d1a2fa9b6fb7180a new file mode 100644 index 00000000..c6b76b41 Binary files /dev/null and b/clock/Library/Artifacts/2d/2df85a75e73ada62d1a2fa9b6fb7180a differ diff --git a/clock/Library/Artifacts/2e/2e08d07a7daf431a06f206e16a51db3e b/clock/Library/Artifacts/2e/2e08d07a7daf431a06f206e16a51db3e new file mode 100644 index 00000000..62e0cd25 Binary files /dev/null and b/clock/Library/Artifacts/2e/2e08d07a7daf431a06f206e16a51db3e differ diff --git a/clock/Library/Artifacts/2e/2e679b17b0b8efc7d0d4c1fc1cdae31f b/clock/Library/Artifacts/2e/2e679b17b0b8efc7d0d4c1fc1cdae31f new file mode 100644 index 00000000..45ed57ed Binary files /dev/null and b/clock/Library/Artifacts/2e/2e679b17b0b8efc7d0d4c1fc1cdae31f differ diff --git a/clock/Library/Artifacts/2e/2e69cdcd87332a5a087940da67f85ac5 b/clock/Library/Artifacts/2e/2e69cdcd87332a5a087940da67f85ac5 new file mode 100644 index 00000000..f59f2727 Binary files /dev/null and b/clock/Library/Artifacts/2e/2e69cdcd87332a5a087940da67f85ac5 differ diff --git a/clock/Library/Artifacts/2e/2e9d7f046fd951558e5a14e03ae1fac4 b/clock/Library/Artifacts/2e/2e9d7f046fd951558e5a14e03ae1fac4 new file mode 100644 index 00000000..ae59c2e7 Binary files /dev/null and b/clock/Library/Artifacts/2e/2e9d7f046fd951558e5a14e03ae1fac4 differ diff --git a/clock/Library/Artifacts/2e/2ed1d8f10907b05897e590646514e4b7 b/clock/Library/Artifacts/2e/2ed1d8f10907b05897e590646514e4b7 new file mode 100644 index 00000000..360df4c7 Binary files /dev/null and b/clock/Library/Artifacts/2e/2ed1d8f10907b05897e590646514e4b7 differ diff --git a/clock/Library/Artifacts/2e/2ede6af250f365011b922fd5686ac12f b/clock/Library/Artifacts/2e/2ede6af250f365011b922fd5686ac12f new file mode 100644 index 00000000..09dae986 Binary files /dev/null and b/clock/Library/Artifacts/2e/2ede6af250f365011b922fd5686ac12f differ diff --git a/clock/Library/Artifacts/2e/2ee362d84d364c7927eb1b0755291c5e b/clock/Library/Artifacts/2e/2ee362d84d364c7927eb1b0755291c5e new file mode 100644 index 00000000..ac8eb91f Binary files /dev/null and b/clock/Library/Artifacts/2e/2ee362d84d364c7927eb1b0755291c5e differ diff --git a/clock/Library/Artifacts/2f/2f0e07adf97d2ebb4b04c37f95b0c44d b/clock/Library/Artifacts/2f/2f0e07adf97d2ebb4b04c37f95b0c44d new file mode 100644 index 00000000..8dd2456e Binary files /dev/null and b/clock/Library/Artifacts/2f/2f0e07adf97d2ebb4b04c37f95b0c44d differ diff --git a/clock/Library/Artifacts/2f/2f426f6f3b073bc89510d7dba0f67193 b/clock/Library/Artifacts/2f/2f426f6f3b073bc89510d7dba0f67193 new file mode 100644 index 00000000..2b1eda8f Binary files /dev/null and b/clock/Library/Artifacts/2f/2f426f6f3b073bc89510d7dba0f67193 differ diff --git a/clock/Library/Artifacts/2f/2f4d6a176d3c8c8cd4b198754e3ab9c9 b/clock/Library/Artifacts/2f/2f4d6a176d3c8c8cd4b198754e3ab9c9 new file mode 100644 index 00000000..4d5b2d42 Binary files /dev/null and b/clock/Library/Artifacts/2f/2f4d6a176d3c8c8cd4b198754e3ab9c9 differ diff --git a/clock/Library/Artifacts/2f/2f5d98f7d4ad2bc1364ee90df7aa1495 b/clock/Library/Artifacts/2f/2f5d98f7d4ad2bc1364ee90df7aa1495 new file mode 100644 index 00000000..5b00c890 Binary files /dev/null and b/clock/Library/Artifacts/2f/2f5d98f7d4ad2bc1364ee90df7aa1495 differ diff --git a/clock/Library/Artifacts/2f/2f7ddfaf2169f9843128f02470d25a1e b/clock/Library/Artifacts/2f/2f7ddfaf2169f9843128f02470d25a1e new file mode 100644 index 00000000..c8ff4fe0 Binary files /dev/null and b/clock/Library/Artifacts/2f/2f7ddfaf2169f9843128f02470d25a1e differ diff --git a/clock/Library/Artifacts/2f/2f8fcd67dcaa6f5c125b168fa87fe62d b/clock/Library/Artifacts/2f/2f8fcd67dcaa6f5c125b168fa87fe62d new file mode 100644 index 00000000..2db368eb Binary files /dev/null and b/clock/Library/Artifacts/2f/2f8fcd67dcaa6f5c125b168fa87fe62d differ diff --git a/clock/Library/Artifacts/2f/2fef6a58951c01d6efe565a5d4c23824 b/clock/Library/Artifacts/2f/2fef6a58951c01d6efe565a5d4c23824 new file mode 100644 index 00000000..21aa3677 Binary files /dev/null and b/clock/Library/Artifacts/2f/2fef6a58951c01d6efe565a5d4c23824 differ diff --git a/clock/Library/Artifacts/30/301d2a805b957408c729ce1b6d9d3f47 b/clock/Library/Artifacts/30/301d2a805b957408c729ce1b6d9d3f47 new file mode 100644 index 00000000..162bf341 Binary files /dev/null and b/clock/Library/Artifacts/30/301d2a805b957408c729ce1b6d9d3f47 differ diff --git a/clock/Library/Artifacts/30/30203721e050dac4431d3cc552dd6f9d b/clock/Library/Artifacts/30/30203721e050dac4431d3cc552dd6f9d new file mode 100644 index 00000000..12732525 Binary files /dev/null and b/clock/Library/Artifacts/30/30203721e050dac4431d3cc552dd6f9d differ diff --git a/clock/Library/Artifacts/30/305255050af0802d70cbdbe2bc822516 b/clock/Library/Artifacts/30/305255050af0802d70cbdbe2bc822516 new file mode 100644 index 00000000..3effbc1e Binary files /dev/null and b/clock/Library/Artifacts/30/305255050af0802d70cbdbe2bc822516 differ diff --git a/clock/Library/Artifacts/30/307f86e4b28472200be4bea16870c0bb b/clock/Library/Artifacts/30/307f86e4b28472200be4bea16870c0bb new file mode 100644 index 00000000..2b3d3956 Binary files /dev/null and b/clock/Library/Artifacts/30/307f86e4b28472200be4bea16870c0bb differ diff --git a/clock/Library/Artifacts/30/3091fe3780d0a39978a6fb42e6521b08 b/clock/Library/Artifacts/30/3091fe3780d0a39978a6fb42e6521b08 new file mode 100644 index 00000000..800e1112 Binary files /dev/null and b/clock/Library/Artifacts/30/3091fe3780d0a39978a6fb42e6521b08 differ diff --git a/clock/Library/Artifacts/30/3097c99359749b266b586bf791d5b3d9 b/clock/Library/Artifacts/30/3097c99359749b266b586bf791d5b3d9 new file mode 100644 index 00000000..d52f2b42 Binary files /dev/null and b/clock/Library/Artifacts/30/3097c99359749b266b586bf791d5b3d9 differ diff --git a/clock/Library/Artifacts/30/30c03d5aca324a9a5bb603856a6323bd b/clock/Library/Artifacts/30/30c03d5aca324a9a5bb603856a6323bd new file mode 100644 index 00000000..ff9ba8b7 Binary files /dev/null and b/clock/Library/Artifacts/30/30c03d5aca324a9a5bb603856a6323bd differ diff --git a/clock/Library/Artifacts/30/30e04922499df5b0d0497a29ff208cd2 b/clock/Library/Artifacts/30/30e04922499df5b0d0497a29ff208cd2 new file mode 100644 index 00000000..e1799826 Binary files /dev/null and b/clock/Library/Artifacts/30/30e04922499df5b0d0497a29ff208cd2 differ diff --git a/clock/Library/Artifacts/31/3139f1f1b18c817111c85fa1b34a3f7a b/clock/Library/Artifacts/31/3139f1f1b18c817111c85fa1b34a3f7a new file mode 100644 index 00000000..13eb790d Binary files /dev/null and b/clock/Library/Artifacts/31/3139f1f1b18c817111c85fa1b34a3f7a differ diff --git a/clock/Library/Artifacts/31/3151228b7259e0c6e0f9f938fc6ec418 b/clock/Library/Artifacts/31/3151228b7259e0c6e0f9f938fc6ec418 new file mode 100644 index 00000000..3d55f13b Binary files /dev/null and b/clock/Library/Artifacts/31/3151228b7259e0c6e0f9f938fc6ec418 differ diff --git a/clock/Library/Artifacts/31/3186d9690cf1cbd0860d986106a3cca2 b/clock/Library/Artifacts/31/3186d9690cf1cbd0860d986106a3cca2 new file mode 100644 index 00000000..22c268f0 Binary files /dev/null and b/clock/Library/Artifacts/31/3186d9690cf1cbd0860d986106a3cca2 differ diff --git a/clock/Library/Artifacts/31/31a25bd3d8432ae1c4a76e346bc8f14c b/clock/Library/Artifacts/31/31a25bd3d8432ae1c4a76e346bc8f14c new file mode 100644 index 00000000..ec5c55a4 Binary files /dev/null and b/clock/Library/Artifacts/31/31a25bd3d8432ae1c4a76e346bc8f14c differ diff --git a/clock/Library/Artifacts/31/31bd616991bc3055b9697cf7894ed642 b/clock/Library/Artifacts/31/31bd616991bc3055b9697cf7894ed642 new file mode 100644 index 00000000..07a915fe Binary files /dev/null and b/clock/Library/Artifacts/31/31bd616991bc3055b9697cf7894ed642 differ diff --git a/clock/Library/Artifacts/31/31fd346184ea82cf00ed08a6ed19b113 b/clock/Library/Artifacts/31/31fd346184ea82cf00ed08a6ed19b113 new file mode 100644 index 00000000..6ad298bd Binary files /dev/null and b/clock/Library/Artifacts/31/31fd346184ea82cf00ed08a6ed19b113 differ diff --git a/clock/Library/Artifacts/32/321bdb0fcd5492bfed628b3efbd65363 b/clock/Library/Artifacts/32/321bdb0fcd5492bfed628b3efbd65363 new file mode 100644 index 00000000..6429dfd0 Binary files /dev/null and b/clock/Library/Artifacts/32/321bdb0fcd5492bfed628b3efbd65363 differ diff --git a/clock/Library/Artifacts/32/324983fe4be521feb6e84e078b72ef30 b/clock/Library/Artifacts/32/324983fe4be521feb6e84e078b72ef30 new file mode 100644 index 00000000..0a3adb53 Binary files /dev/null and b/clock/Library/Artifacts/32/324983fe4be521feb6e84e078b72ef30 differ diff --git a/clock/Library/Artifacts/32/32649cb7b5c3f4c0001fe43130179919 b/clock/Library/Artifacts/32/32649cb7b5c3f4c0001fe43130179919 new file mode 100644 index 00000000..c51c1040 Binary files /dev/null and b/clock/Library/Artifacts/32/32649cb7b5c3f4c0001fe43130179919 differ diff --git a/clock/Library/Artifacts/32/32a68feebfcdb5b7b32d02f9ee0735bd b/clock/Library/Artifacts/32/32a68feebfcdb5b7b32d02f9ee0735bd new file mode 100644 index 00000000..0d669435 Binary files /dev/null and b/clock/Library/Artifacts/32/32a68feebfcdb5b7b32d02f9ee0735bd differ diff --git a/clock/Library/Artifacts/32/32b8de4784afa28f169b96ee81e8e2fd b/clock/Library/Artifacts/32/32b8de4784afa28f169b96ee81e8e2fd new file mode 100644 index 00000000..2174e840 Binary files /dev/null and b/clock/Library/Artifacts/32/32b8de4784afa28f169b96ee81e8e2fd differ diff --git a/clock/Library/Artifacts/33/3381b3ed9904928cf38fdce3590a57a6 b/clock/Library/Artifacts/33/3381b3ed9904928cf38fdce3590a57a6 new file mode 100644 index 00000000..e608bacd Binary files /dev/null and b/clock/Library/Artifacts/33/3381b3ed9904928cf38fdce3590a57a6 differ diff --git a/clock/Library/Artifacts/33/33f1065634dd655469bf5e9ef26795a7 b/clock/Library/Artifacts/33/33f1065634dd655469bf5e9ef26795a7 new file mode 100644 index 00000000..dab384af Binary files /dev/null and b/clock/Library/Artifacts/33/33f1065634dd655469bf5e9ef26795a7 differ diff --git a/clock/Library/Artifacts/34/3419806a837ba1fc9a2cb45929626291 b/clock/Library/Artifacts/34/3419806a837ba1fc9a2cb45929626291 new file mode 100644 index 00000000..aa204e53 Binary files /dev/null and b/clock/Library/Artifacts/34/3419806a837ba1fc9a2cb45929626291 differ diff --git a/clock/Library/Artifacts/34/345158e86427605dab7d96a7112c2a5e b/clock/Library/Artifacts/34/345158e86427605dab7d96a7112c2a5e new file mode 100644 index 00000000..eecdf655 Binary files /dev/null and b/clock/Library/Artifacts/34/345158e86427605dab7d96a7112c2a5e differ diff --git a/clock/Library/Artifacts/34/348d53935bc89235ea89aa38b9fafdda b/clock/Library/Artifacts/34/348d53935bc89235ea89aa38b9fafdda new file mode 100644 index 00000000..1b42872e Binary files /dev/null and b/clock/Library/Artifacts/34/348d53935bc89235ea89aa38b9fafdda differ diff --git a/clock/Library/Artifacts/34/34eff001b92b488886f0d2d7ee967e38 b/clock/Library/Artifacts/34/34eff001b92b488886f0d2d7ee967e38 new file mode 100644 index 00000000..9365a64a Binary files /dev/null and b/clock/Library/Artifacts/34/34eff001b92b488886f0d2d7ee967e38 differ diff --git a/clock/Library/Artifacts/35/352031d2fa1a951f4a60bfbc1c6702f5 b/clock/Library/Artifacts/35/352031d2fa1a951f4a60bfbc1c6702f5 new file mode 100644 index 00000000..465d8c85 Binary files /dev/null and b/clock/Library/Artifacts/35/352031d2fa1a951f4a60bfbc1c6702f5 differ diff --git a/clock/Library/Artifacts/35/35894fd4d4ff43f6fba997aab07047bf b/clock/Library/Artifacts/35/35894fd4d4ff43f6fba997aab07047bf new file mode 100644 index 00000000..2b4cf12e Binary files /dev/null and b/clock/Library/Artifacts/35/35894fd4d4ff43f6fba997aab07047bf differ diff --git a/clock/Library/Artifacts/35/358b30307b8aaccdad2f7cd7db9a86d8 b/clock/Library/Artifacts/35/358b30307b8aaccdad2f7cd7db9a86d8 new file mode 100644 index 00000000..d608604a Binary files /dev/null and b/clock/Library/Artifacts/35/358b30307b8aaccdad2f7cd7db9a86d8 differ diff --git a/clock/Library/Artifacts/35/35dafdf9aed2f28be2f7e2bd49613b8b b/clock/Library/Artifacts/35/35dafdf9aed2f28be2f7e2bd49613b8b new file mode 100644 index 00000000..1c90061c Binary files /dev/null and b/clock/Library/Artifacts/35/35dafdf9aed2f28be2f7e2bd49613b8b differ diff --git a/clock/Library/Artifacts/36/36224068e4b936a22f5f61e83b247954 b/clock/Library/Artifacts/36/36224068e4b936a22f5f61e83b247954 new file mode 100644 index 00000000..e997cbe9 Binary files /dev/null and b/clock/Library/Artifacts/36/36224068e4b936a22f5f61e83b247954 differ diff --git a/clock/Library/Artifacts/36/36339863cfceb85e705aa4f35df005f0 b/clock/Library/Artifacts/36/36339863cfceb85e705aa4f35df005f0 new file mode 100644 index 00000000..433cf4d4 Binary files /dev/null and b/clock/Library/Artifacts/36/36339863cfceb85e705aa4f35df005f0 differ diff --git a/clock/Library/Artifacts/36/3653c1924bcda56148685c30f3472190 b/clock/Library/Artifacts/36/3653c1924bcda56148685c30f3472190 new file mode 100644 index 00000000..a356282f Binary files /dev/null and b/clock/Library/Artifacts/36/3653c1924bcda56148685c30f3472190 differ diff --git a/clock/Library/Artifacts/36/36875e2a541bfea4487b544572389997 b/clock/Library/Artifacts/36/36875e2a541bfea4487b544572389997 new file mode 100644 index 00000000..5ecf5f5e Binary files /dev/null and b/clock/Library/Artifacts/36/36875e2a541bfea4487b544572389997 differ diff --git a/clock/Library/Artifacts/36/3696b6f4263ba52870fea021e224e566 b/clock/Library/Artifacts/36/3696b6f4263ba52870fea021e224e566 new file mode 100644 index 00000000..514a3e5e Binary files /dev/null and b/clock/Library/Artifacts/36/3696b6f4263ba52870fea021e224e566 differ diff --git a/clock/Library/Artifacts/36/369ed401c890ff3a1a89fa292cc37363 b/clock/Library/Artifacts/36/369ed401c890ff3a1a89fa292cc37363 new file mode 100644 index 00000000..f122c2b4 Binary files /dev/null and b/clock/Library/Artifacts/36/369ed401c890ff3a1a89fa292cc37363 differ diff --git a/clock/Library/Artifacts/36/36a1615a39ba28033597342c68f0bc11 b/clock/Library/Artifacts/36/36a1615a39ba28033597342c68f0bc11 new file mode 100644 index 00000000..1a3f6810 Binary files /dev/null and b/clock/Library/Artifacts/36/36a1615a39ba28033597342c68f0bc11 differ diff --git a/clock/Library/Artifacts/36/36a2de09fb33c2565c0993dfa6e6c90a b/clock/Library/Artifacts/36/36a2de09fb33c2565c0993dfa6e6c90a new file mode 100644 index 00000000..4380526c Binary files /dev/null and b/clock/Library/Artifacts/36/36a2de09fb33c2565c0993dfa6e6c90a differ diff --git a/clock/Library/Artifacts/36/36b06f52f8ca6edd49212592929954ea b/clock/Library/Artifacts/36/36b06f52f8ca6edd49212592929954ea new file mode 100644 index 00000000..d8d1b4e6 Binary files /dev/null and b/clock/Library/Artifacts/36/36b06f52f8ca6edd49212592929954ea differ diff --git a/clock/Library/Artifacts/36/36b780547d20a4a0993e4ed923737532 b/clock/Library/Artifacts/36/36b780547d20a4a0993e4ed923737532 new file mode 100644 index 00000000..79aafa64 Binary files /dev/null and b/clock/Library/Artifacts/36/36b780547d20a4a0993e4ed923737532 differ diff --git a/clock/Library/Artifacts/36/36eb3e9b583eb037426c3d8fd74dc57b b/clock/Library/Artifacts/36/36eb3e9b583eb037426c3d8fd74dc57b new file mode 100644 index 00000000..c1758308 Binary files /dev/null and b/clock/Library/Artifacts/36/36eb3e9b583eb037426c3d8fd74dc57b differ diff --git a/clock/Library/Artifacts/37/372386564b0f6514bbe65f01522c3cb9 b/clock/Library/Artifacts/37/372386564b0f6514bbe65f01522c3cb9 new file mode 100644 index 00000000..7e03b3f4 Binary files /dev/null and b/clock/Library/Artifacts/37/372386564b0f6514bbe65f01522c3cb9 differ diff --git a/clock/Library/Artifacts/37/37454fefed96a740aa42d55fc3a33119 b/clock/Library/Artifacts/37/37454fefed96a740aa42d55fc3a33119 new file mode 100644 index 00000000..9ce1ddd1 Binary files /dev/null and b/clock/Library/Artifacts/37/37454fefed96a740aa42d55fc3a33119 differ diff --git a/clock/Library/Artifacts/37/37539e848e363e047ab11bbb9a641410 b/clock/Library/Artifacts/37/37539e848e363e047ab11bbb9a641410 new file mode 100644 index 00000000..b8c31d76 Binary files /dev/null and b/clock/Library/Artifacts/37/37539e848e363e047ab11bbb9a641410 differ diff --git a/clock/Library/Artifacts/37/377709f1a394bc91068e99d0c83e521a b/clock/Library/Artifacts/37/377709f1a394bc91068e99d0c83e521a new file mode 100644 index 00000000..e36283e1 Binary files /dev/null and b/clock/Library/Artifacts/37/377709f1a394bc91068e99d0c83e521a differ diff --git a/clock/Library/Artifacts/37/379acde67e7532a9471bf6fcf8ade805 b/clock/Library/Artifacts/37/379acde67e7532a9471bf6fcf8ade805 new file mode 100644 index 00000000..f0e636bc Binary files /dev/null and b/clock/Library/Artifacts/37/379acde67e7532a9471bf6fcf8ade805 differ diff --git a/clock/Library/Artifacts/37/37bee9b8072e9e71f4af6ef5152ac205 b/clock/Library/Artifacts/37/37bee9b8072e9e71f4af6ef5152ac205 new file mode 100644 index 00000000..c3028e4c Binary files /dev/null and b/clock/Library/Artifacts/37/37bee9b8072e9e71f4af6ef5152ac205 differ diff --git a/clock/Library/Artifacts/37/37e3295097d1b7bb39558e2ae511afc6 b/clock/Library/Artifacts/37/37e3295097d1b7bb39558e2ae511afc6 new file mode 100644 index 00000000..d8512079 Binary files /dev/null and b/clock/Library/Artifacts/37/37e3295097d1b7bb39558e2ae511afc6 differ diff --git a/clock/Library/Artifacts/38/384de0e6499d67137a541ae360fa11d2 b/clock/Library/Artifacts/38/384de0e6499d67137a541ae360fa11d2 new file mode 100644 index 00000000..747f0a02 Binary files /dev/null and b/clock/Library/Artifacts/38/384de0e6499d67137a541ae360fa11d2 differ diff --git a/clock/Library/Artifacts/38/385c509d9162ef8d07d6f267b3d8db49 b/clock/Library/Artifacts/38/385c509d9162ef8d07d6f267b3d8db49 new file mode 100644 index 00000000..741d488c Binary files /dev/null and b/clock/Library/Artifacts/38/385c509d9162ef8d07d6f267b3d8db49 differ diff --git a/clock/Library/Artifacts/38/38a0838b273551a3887e1cb4bdefb073 b/clock/Library/Artifacts/38/38a0838b273551a3887e1cb4bdefb073 new file mode 100644 index 00000000..bf7ad021 Binary files /dev/null and b/clock/Library/Artifacts/38/38a0838b273551a3887e1cb4bdefb073 differ diff --git a/clock/Library/Artifacts/38/38a5e89ab7ca8911c27632a43164356e b/clock/Library/Artifacts/38/38a5e89ab7ca8911c27632a43164356e new file mode 100644 index 00000000..21bf82c2 Binary files /dev/null and b/clock/Library/Artifacts/38/38a5e89ab7ca8911c27632a43164356e differ diff --git a/clock/Library/Artifacts/39/390d8f522a54df349a4e3bb05fbbf750 b/clock/Library/Artifacts/39/390d8f522a54df349a4e3bb05fbbf750 new file mode 100644 index 00000000..bbb68ff0 Binary files /dev/null and b/clock/Library/Artifacts/39/390d8f522a54df349a4e3bb05fbbf750 differ diff --git a/clock/Library/Artifacts/39/392aa6ed9cf939e0da48d06857bef3b6 b/clock/Library/Artifacts/39/392aa6ed9cf939e0da48d06857bef3b6 new file mode 100644 index 00000000..e0ab75fe Binary files /dev/null and b/clock/Library/Artifacts/39/392aa6ed9cf939e0da48d06857bef3b6 differ diff --git a/clock/Library/Artifacts/39/39781d2524cf795e9f7d37b7ebfc8b08 b/clock/Library/Artifacts/39/39781d2524cf795e9f7d37b7ebfc8b08 new file mode 100644 index 00000000..12cebf3d Binary files /dev/null and b/clock/Library/Artifacts/39/39781d2524cf795e9f7d37b7ebfc8b08 differ diff --git a/clock/Library/Artifacts/39/39908ddd50e35892dbda8e3a5f8a8dc5 b/clock/Library/Artifacts/39/39908ddd50e35892dbda8e3a5f8a8dc5 new file mode 100644 index 00000000..c8793d84 Binary files /dev/null and b/clock/Library/Artifacts/39/39908ddd50e35892dbda8e3a5f8a8dc5 differ diff --git a/clock/Library/Artifacts/39/3991056d747fd45016d1c80a3f1a2f5e b/clock/Library/Artifacts/39/3991056d747fd45016d1c80a3f1a2f5e new file mode 100644 index 00000000..b67d7f18 Binary files /dev/null and b/clock/Library/Artifacts/39/3991056d747fd45016d1c80a3f1a2f5e differ diff --git a/clock/Library/Artifacts/39/39a14cd3fbb1ee8efcec9d9100559c75 b/clock/Library/Artifacts/39/39a14cd3fbb1ee8efcec9d9100559c75 new file mode 100644 index 00000000..7cd098df Binary files /dev/null and b/clock/Library/Artifacts/39/39a14cd3fbb1ee8efcec9d9100559c75 differ diff --git a/clock/Library/Artifacts/39/39a3cc357473286dcfafc4325758d7cc b/clock/Library/Artifacts/39/39a3cc357473286dcfafc4325758d7cc new file mode 100644 index 00000000..1088a100 Binary files /dev/null and b/clock/Library/Artifacts/39/39a3cc357473286dcfafc4325758d7cc differ diff --git a/clock/Library/Artifacts/39/39ba02fe209ae9e6fb04bd4e4dbb87ca b/clock/Library/Artifacts/39/39ba02fe209ae9e6fb04bd4e4dbb87ca new file mode 100644 index 00000000..eac2a6dd Binary files /dev/null and b/clock/Library/Artifacts/39/39ba02fe209ae9e6fb04bd4e4dbb87ca differ diff --git a/clock/Library/Artifacts/39/39d15b1e409260b2205ede5f464ff657 b/clock/Library/Artifacts/39/39d15b1e409260b2205ede5f464ff657 new file mode 100644 index 00000000..9408a0b6 Binary files /dev/null and b/clock/Library/Artifacts/39/39d15b1e409260b2205ede5f464ff657 differ diff --git a/clock/Library/Artifacts/39/39fd7a087627fac98e14f9c1cc43e357 b/clock/Library/Artifacts/39/39fd7a087627fac98e14f9c1cc43e357 new file mode 100644 index 00000000..817b8d4a Binary files /dev/null and b/clock/Library/Artifacts/39/39fd7a087627fac98e14f9c1cc43e357 differ diff --git a/clock/Library/Artifacts/39/39fe5e404ca21c360ddb6306ff0eb24a b/clock/Library/Artifacts/39/39fe5e404ca21c360ddb6306ff0eb24a new file mode 100644 index 00000000..11057c3a Binary files /dev/null and b/clock/Library/Artifacts/39/39fe5e404ca21c360ddb6306ff0eb24a differ diff --git a/clock/Library/Artifacts/3a/3a0de0163a0389e0fd7dcaed7af172aa b/clock/Library/Artifacts/3a/3a0de0163a0389e0fd7dcaed7af172aa new file mode 100644 index 00000000..0e22b8d7 Binary files /dev/null and b/clock/Library/Artifacts/3a/3a0de0163a0389e0fd7dcaed7af172aa differ diff --git a/clock/Library/Artifacts/3a/3a162222dbc13d96633fd6fc9f6e525b b/clock/Library/Artifacts/3a/3a162222dbc13d96633fd6fc9f6e525b new file mode 100644 index 00000000..63185271 Binary files /dev/null and b/clock/Library/Artifacts/3a/3a162222dbc13d96633fd6fc9f6e525b differ diff --git a/clock/Library/Artifacts/3a/3a74d0cc2ec35175687c4fa08c75efab b/clock/Library/Artifacts/3a/3a74d0cc2ec35175687c4fa08c75efab new file mode 100644 index 00000000..02c16173 Binary files /dev/null and b/clock/Library/Artifacts/3a/3a74d0cc2ec35175687c4fa08c75efab differ diff --git a/clock/Library/Artifacts/3a/3a8b20f6bd4c23438ff387f4f0108943 b/clock/Library/Artifacts/3a/3a8b20f6bd4c23438ff387f4f0108943 new file mode 100644 index 00000000..33775b8c Binary files /dev/null and b/clock/Library/Artifacts/3a/3a8b20f6bd4c23438ff387f4f0108943 differ diff --git a/clock/Library/Artifacts/3a/3aa195e5f52f0da883d43073eaf45c60 b/clock/Library/Artifacts/3a/3aa195e5f52f0da883d43073eaf45c60 new file mode 100644 index 00000000..2ed59a8f Binary files /dev/null and b/clock/Library/Artifacts/3a/3aa195e5f52f0da883d43073eaf45c60 differ diff --git a/clock/Library/Artifacts/3a/3aa8727494a07230ed2c311ae85a13c6 b/clock/Library/Artifacts/3a/3aa8727494a07230ed2c311ae85a13c6 new file mode 100644 index 00000000..37d9b4da Binary files /dev/null and b/clock/Library/Artifacts/3a/3aa8727494a07230ed2c311ae85a13c6 differ diff --git a/clock/Library/Artifacts/3a/3acdf3d77f105b24c6aaed7a2928122d b/clock/Library/Artifacts/3a/3acdf3d77f105b24c6aaed7a2928122d new file mode 100644 index 00000000..cbff643b Binary files /dev/null and b/clock/Library/Artifacts/3a/3acdf3d77f105b24c6aaed7a2928122d differ diff --git a/clock/Library/Artifacts/3a/3ae7d77c7fed792cbe986c8208437291 b/clock/Library/Artifacts/3a/3ae7d77c7fed792cbe986c8208437291 new file mode 100644 index 00000000..22a3c774 Binary files /dev/null and b/clock/Library/Artifacts/3a/3ae7d77c7fed792cbe986c8208437291 differ diff --git a/clock/Library/Artifacts/3b/3b0bd20a2e7e2c8bcc8485b52d1bcd8b b/clock/Library/Artifacts/3b/3b0bd20a2e7e2c8bcc8485b52d1bcd8b new file mode 100644 index 00000000..87d0fc57 Binary files /dev/null and b/clock/Library/Artifacts/3b/3b0bd20a2e7e2c8bcc8485b52d1bcd8b differ diff --git a/clock/Library/Artifacts/3b/3b1dcc00a3b965ba54a59a27194bf20b b/clock/Library/Artifacts/3b/3b1dcc00a3b965ba54a59a27194bf20b new file mode 100644 index 00000000..1c4ed504 Binary files /dev/null and b/clock/Library/Artifacts/3b/3b1dcc00a3b965ba54a59a27194bf20b differ diff --git a/clock/Library/Artifacts/3b/3b5f4703713698b8c7f2244b1089a722 b/clock/Library/Artifacts/3b/3b5f4703713698b8c7f2244b1089a722 new file mode 100644 index 00000000..ba161b8a Binary files /dev/null and b/clock/Library/Artifacts/3b/3b5f4703713698b8c7f2244b1089a722 differ diff --git a/clock/Library/Artifacts/3b/3b74fe38ec69e119fd2301f7795dcade b/clock/Library/Artifacts/3b/3b74fe38ec69e119fd2301f7795dcade new file mode 100644 index 00000000..100e7375 Binary files /dev/null and b/clock/Library/Artifacts/3b/3b74fe38ec69e119fd2301f7795dcade differ diff --git a/clock/Library/Artifacts/3b/3b76e03cc6134422d4670a14dab598d2 b/clock/Library/Artifacts/3b/3b76e03cc6134422d4670a14dab598d2 new file mode 100644 index 00000000..fb2def4e Binary files /dev/null and b/clock/Library/Artifacts/3b/3b76e03cc6134422d4670a14dab598d2 differ diff --git a/clock/Library/Artifacts/3b/3ba49ec9664650706f52c5a8b736f50a b/clock/Library/Artifacts/3b/3ba49ec9664650706f52c5a8b736f50a new file mode 100644 index 00000000..2dc43d37 Binary files /dev/null and b/clock/Library/Artifacts/3b/3ba49ec9664650706f52c5a8b736f50a differ diff --git a/clock/Library/Artifacts/3b/3baa1c4a24188436b4d88fc17b4440c4 b/clock/Library/Artifacts/3b/3baa1c4a24188436b4d88fc17b4440c4 new file mode 100644 index 00000000..d22a945c Binary files /dev/null and b/clock/Library/Artifacts/3b/3baa1c4a24188436b4d88fc17b4440c4 differ diff --git a/clock/Library/Artifacts/3b/3baee8e21ae3d985d1fde148085e6f63 b/clock/Library/Artifacts/3b/3baee8e21ae3d985d1fde148085e6f63 new file mode 100644 index 00000000..e3ddb05a Binary files /dev/null and b/clock/Library/Artifacts/3b/3baee8e21ae3d985d1fde148085e6f63 differ diff --git a/clock/Library/Artifacts/3b/3bd3d2a1dc1e80ee3eb8e8ddb21556ec b/clock/Library/Artifacts/3b/3bd3d2a1dc1e80ee3eb8e8ddb21556ec new file mode 100644 index 00000000..3411e7af Binary files /dev/null and b/clock/Library/Artifacts/3b/3bd3d2a1dc1e80ee3eb8e8ddb21556ec differ diff --git a/clock/Library/Artifacts/3b/3bf8ed12cd6aaef73a0b7143f159d70a b/clock/Library/Artifacts/3b/3bf8ed12cd6aaef73a0b7143f159d70a new file mode 100644 index 00000000..f87124fb Binary files /dev/null and b/clock/Library/Artifacts/3b/3bf8ed12cd6aaef73a0b7143f159d70a differ diff --git a/clock/Library/Artifacts/3c/3c2892168e69e1f7395adabbf17b2872 b/clock/Library/Artifacts/3c/3c2892168e69e1f7395adabbf17b2872 new file mode 100644 index 00000000..3c6c3adf Binary files /dev/null and b/clock/Library/Artifacts/3c/3c2892168e69e1f7395adabbf17b2872 differ diff --git a/clock/Library/Artifacts/3c/3c3324234d3371eb1f3506e482844458 b/clock/Library/Artifacts/3c/3c3324234d3371eb1f3506e482844458 new file mode 100644 index 00000000..7dc4bcfe Binary files /dev/null and b/clock/Library/Artifacts/3c/3c3324234d3371eb1f3506e482844458 differ diff --git a/clock/Library/Artifacts/3c/3c37651da2ce9f83cde400bb4430f7bd b/clock/Library/Artifacts/3c/3c37651da2ce9f83cde400bb4430f7bd new file mode 100644 index 00000000..f0b86e86 Binary files /dev/null and b/clock/Library/Artifacts/3c/3c37651da2ce9f83cde400bb4430f7bd differ diff --git a/clock/Library/Artifacts/3c/3c3c2e5364b63e82685dd59c304393f7 b/clock/Library/Artifacts/3c/3c3c2e5364b63e82685dd59c304393f7 new file mode 100644 index 00000000..b8dd5971 Binary files /dev/null and b/clock/Library/Artifacts/3c/3c3c2e5364b63e82685dd59c304393f7 differ diff --git a/clock/Library/Artifacts/3c/3cc0290ebe12119281b23cade8e04971 b/clock/Library/Artifacts/3c/3cc0290ebe12119281b23cade8e04971 new file mode 100644 index 00000000..fbeee2cd Binary files /dev/null and b/clock/Library/Artifacts/3c/3cc0290ebe12119281b23cade8e04971 differ diff --git a/clock/Library/Artifacts/3c/3cc3c51d0646097681e3898cea140cde b/clock/Library/Artifacts/3c/3cc3c51d0646097681e3898cea140cde new file mode 100644 index 00000000..b94a2415 Binary files /dev/null and b/clock/Library/Artifacts/3c/3cc3c51d0646097681e3898cea140cde differ diff --git a/clock/Library/Artifacts/3c/3ccf9007523111492c8d627d665fbe27 b/clock/Library/Artifacts/3c/3ccf9007523111492c8d627d665fbe27 new file mode 100644 index 00000000..355f18e2 Binary files /dev/null and b/clock/Library/Artifacts/3c/3ccf9007523111492c8d627d665fbe27 differ diff --git a/clock/Library/Artifacts/3d/3d789f54f165cff6aa553c4a09424c39 b/clock/Library/Artifacts/3d/3d789f54f165cff6aa553c4a09424c39 new file mode 100644 index 00000000..4a38fe97 Binary files /dev/null and b/clock/Library/Artifacts/3d/3d789f54f165cff6aa553c4a09424c39 differ diff --git a/clock/Library/Artifacts/3d/3d90865c04129840d79fdcd7ddff3c82 b/clock/Library/Artifacts/3d/3d90865c04129840d79fdcd7ddff3c82 new file mode 100644 index 00000000..0d3c823d Binary files /dev/null and b/clock/Library/Artifacts/3d/3d90865c04129840d79fdcd7ddff3c82 differ diff --git a/clock/Library/Artifacts/3d/3d9f99be0274815ae6dabcd10293a313 b/clock/Library/Artifacts/3d/3d9f99be0274815ae6dabcd10293a313 new file mode 100644 index 00000000..9ae9c3fe Binary files /dev/null and b/clock/Library/Artifacts/3d/3d9f99be0274815ae6dabcd10293a313 differ diff --git a/clock/Library/Artifacts/3d/3da598fa08cfb9879b37424b8d3ca990 b/clock/Library/Artifacts/3d/3da598fa08cfb9879b37424b8d3ca990 new file mode 100644 index 00000000..db0a8832 Binary files /dev/null and b/clock/Library/Artifacts/3d/3da598fa08cfb9879b37424b8d3ca990 differ diff --git a/clock/Library/Artifacts/3d/3def083e56d2bf23288eaccec8c36b3e b/clock/Library/Artifacts/3d/3def083e56d2bf23288eaccec8c36b3e new file mode 100644 index 00000000..7d740bb7 Binary files /dev/null and b/clock/Library/Artifacts/3d/3def083e56d2bf23288eaccec8c36b3e differ diff --git a/clock/Library/Artifacts/3d/3df93784d013a9f50a8d444614013c63 b/clock/Library/Artifacts/3d/3df93784d013a9f50a8d444614013c63 new file mode 100644 index 00000000..d4022b38 Binary files /dev/null and b/clock/Library/Artifacts/3d/3df93784d013a9f50a8d444614013c63 differ diff --git a/clock/Library/Artifacts/3e/3e16e657d9536c5dbf71eebfccfbc55b b/clock/Library/Artifacts/3e/3e16e657d9536c5dbf71eebfccfbc55b new file mode 100644 index 00000000..e95b65c3 Binary files /dev/null and b/clock/Library/Artifacts/3e/3e16e657d9536c5dbf71eebfccfbc55b differ diff --git a/clock/Library/Artifacts/3e/3e2c9e273cd07df7808e10c766c271c3 b/clock/Library/Artifacts/3e/3e2c9e273cd07df7808e10c766c271c3 new file mode 100644 index 00000000..96358370 Binary files /dev/null and b/clock/Library/Artifacts/3e/3e2c9e273cd07df7808e10c766c271c3 differ diff --git a/clock/Library/Artifacts/3e/3e6796b88ecdeb5222029903a99a24b8 b/clock/Library/Artifacts/3e/3e6796b88ecdeb5222029903a99a24b8 new file mode 100644 index 00000000..48e6a539 Binary files /dev/null and b/clock/Library/Artifacts/3e/3e6796b88ecdeb5222029903a99a24b8 differ diff --git a/clock/Library/Artifacts/3e/3e93439decb1fe83fa70bdc14027436f b/clock/Library/Artifacts/3e/3e93439decb1fe83fa70bdc14027436f new file mode 100644 index 00000000..5d4c35a7 Binary files /dev/null and b/clock/Library/Artifacts/3e/3e93439decb1fe83fa70bdc14027436f differ diff --git a/clock/Library/Artifacts/3e/3ece3abb7f1d4a1ce235b9380da56117 b/clock/Library/Artifacts/3e/3ece3abb7f1d4a1ce235b9380da56117 new file mode 100644 index 00000000..2f9cd21b Binary files /dev/null and b/clock/Library/Artifacts/3e/3ece3abb7f1d4a1ce235b9380da56117 differ diff --git a/clock/Library/Artifacts/3f/3f2db56d72899737bbd52ffce665ab74 b/clock/Library/Artifacts/3f/3f2db56d72899737bbd52ffce665ab74 new file mode 100644 index 00000000..2ffa827e Binary files /dev/null and b/clock/Library/Artifacts/3f/3f2db56d72899737bbd52ffce665ab74 differ diff --git a/clock/Library/Artifacts/3f/3f6add89e246afe3a51d768f4d74e161 b/clock/Library/Artifacts/3f/3f6add89e246afe3a51d768f4d74e161 new file mode 100644 index 00000000..54859351 Binary files /dev/null and b/clock/Library/Artifacts/3f/3f6add89e246afe3a51d768f4d74e161 differ diff --git a/clock/Library/Artifacts/3f/3f878ef34779674a3880a4f567a87ff5 b/clock/Library/Artifacts/3f/3f878ef34779674a3880a4f567a87ff5 new file mode 100644 index 00000000..6747ee52 Binary files /dev/null and b/clock/Library/Artifacts/3f/3f878ef34779674a3880a4f567a87ff5 differ diff --git a/clock/Library/Artifacts/3f/3fb98a640c3dea65702f003717e5eada b/clock/Library/Artifacts/3f/3fb98a640c3dea65702f003717e5eada new file mode 100644 index 00000000..1a993fd9 Binary files /dev/null and b/clock/Library/Artifacts/3f/3fb98a640c3dea65702f003717e5eada differ diff --git a/clock/Library/Artifacts/3f/3fec436bfa76c171cc47cd25be0c31fc b/clock/Library/Artifacts/3f/3fec436bfa76c171cc47cd25be0c31fc new file mode 100644 index 00000000..7c051c18 Binary files /dev/null and b/clock/Library/Artifacts/3f/3fec436bfa76c171cc47cd25be0c31fc differ diff --git a/clock/Library/Artifacts/40/4026fbe2ec73c2a73090d4f6bcaf94da b/clock/Library/Artifacts/40/4026fbe2ec73c2a73090d4f6bcaf94da new file mode 100644 index 00000000..8a01720f Binary files /dev/null and b/clock/Library/Artifacts/40/4026fbe2ec73c2a73090d4f6bcaf94da differ diff --git a/clock/Library/Artifacts/40/40566722eb2c9f8739ebd7bade9a3bcf b/clock/Library/Artifacts/40/40566722eb2c9f8739ebd7bade9a3bcf new file mode 100644 index 00000000..d79195d5 Binary files /dev/null and b/clock/Library/Artifacts/40/40566722eb2c9f8739ebd7bade9a3bcf differ diff --git a/clock/Library/Artifacts/40/40949f17e700e3f9905b748b474b4b2e b/clock/Library/Artifacts/40/40949f17e700e3f9905b748b474b4b2e new file mode 100644 index 00000000..ddb058ba Binary files /dev/null and b/clock/Library/Artifacts/40/40949f17e700e3f9905b748b474b4b2e differ diff --git a/clock/Library/Artifacts/40/40d6836293cacce668e9415daeed7182 b/clock/Library/Artifacts/40/40d6836293cacce668e9415daeed7182 new file mode 100644 index 00000000..07eba70a Binary files /dev/null and b/clock/Library/Artifacts/40/40d6836293cacce668e9415daeed7182 differ diff --git a/clock/Library/Artifacts/40/40e5ff8f74966870b88b7d260b6b7cbf b/clock/Library/Artifacts/40/40e5ff8f74966870b88b7d260b6b7cbf new file mode 100644 index 00000000..c734b2fe Binary files /dev/null and b/clock/Library/Artifacts/40/40e5ff8f74966870b88b7d260b6b7cbf differ diff --git a/clock/Library/Artifacts/40/40f2af9106f5e91004d312b4d952b7d3 b/clock/Library/Artifacts/40/40f2af9106f5e91004d312b4d952b7d3 new file mode 100644 index 00000000..42417358 Binary files /dev/null and b/clock/Library/Artifacts/40/40f2af9106f5e91004d312b4d952b7d3 differ diff --git a/clock/Library/Artifacts/40/40f5fa9c193ee5bdce3cdc21577b55cc b/clock/Library/Artifacts/40/40f5fa9c193ee5bdce3cdc21577b55cc new file mode 100644 index 00000000..b2bf33ed Binary files /dev/null and b/clock/Library/Artifacts/40/40f5fa9c193ee5bdce3cdc21577b55cc differ diff --git a/clock/Library/Artifacts/41/411a14de3f1b19ad2f222e92ac3ae475 b/clock/Library/Artifacts/41/411a14de3f1b19ad2f222e92ac3ae475 new file mode 100644 index 00000000..4a41c335 Binary files /dev/null and b/clock/Library/Artifacts/41/411a14de3f1b19ad2f222e92ac3ae475 differ diff --git a/clock/Library/Artifacts/41/411ac59128873ea8e31dfcf0938f9aba b/clock/Library/Artifacts/41/411ac59128873ea8e31dfcf0938f9aba new file mode 100644 index 00000000..309747c5 Binary files /dev/null and b/clock/Library/Artifacts/41/411ac59128873ea8e31dfcf0938f9aba differ diff --git a/clock/Library/Artifacts/41/416e2c9cb28ea099cde92c7c9a732948 b/clock/Library/Artifacts/41/416e2c9cb28ea099cde92c7c9a732948 new file mode 100644 index 00000000..dd72373d Binary files /dev/null and b/clock/Library/Artifacts/41/416e2c9cb28ea099cde92c7c9a732948 differ diff --git a/clock/Library/Artifacts/41/4193cea0c71ac39b5a679d095c38325f b/clock/Library/Artifacts/41/4193cea0c71ac39b5a679d095c38325f new file mode 100644 index 00000000..08cef635 Binary files /dev/null and b/clock/Library/Artifacts/41/4193cea0c71ac39b5a679d095c38325f differ diff --git a/clock/Library/Artifacts/41/41c6c5869236961c25aec4229d604fdb b/clock/Library/Artifacts/41/41c6c5869236961c25aec4229d604fdb new file mode 100644 index 00000000..ca295a21 Binary files /dev/null and b/clock/Library/Artifacts/41/41c6c5869236961c25aec4229d604fdb differ diff --git a/clock/Library/Artifacts/42/421bc6da09d4039f9f530af110891b5f b/clock/Library/Artifacts/42/421bc6da09d4039f9f530af110891b5f new file mode 100644 index 00000000..45d59daa Binary files /dev/null and b/clock/Library/Artifacts/42/421bc6da09d4039f9f530af110891b5f differ diff --git a/clock/Library/Artifacts/42/421dbc2e59555512e364318cd69af4bc b/clock/Library/Artifacts/42/421dbc2e59555512e364318cd69af4bc new file mode 100644 index 00000000..48994128 Binary files /dev/null and b/clock/Library/Artifacts/42/421dbc2e59555512e364318cd69af4bc differ diff --git a/clock/Library/Artifacts/42/4239440714ba38542d80673f849792dd b/clock/Library/Artifacts/42/4239440714ba38542d80673f849792dd new file mode 100644 index 00000000..290be558 Binary files /dev/null and b/clock/Library/Artifacts/42/4239440714ba38542d80673f849792dd differ diff --git a/clock/Library/Artifacts/42/42d4ff8f1a79e63a41e23785940eff93 b/clock/Library/Artifacts/42/42d4ff8f1a79e63a41e23785940eff93 new file mode 100644 index 00000000..87b160ca Binary files /dev/null and b/clock/Library/Artifacts/42/42d4ff8f1a79e63a41e23785940eff93 differ diff --git a/clock/Library/Artifacts/42/42e7237c81706371540d212b8dac8838 b/clock/Library/Artifacts/42/42e7237c81706371540d212b8dac8838 new file mode 100644 index 00000000..40c1e0b9 Binary files /dev/null and b/clock/Library/Artifacts/42/42e7237c81706371540d212b8dac8838 differ diff --git a/clock/Library/Artifacts/43/43babf34dccad4fe1f88584d105082ac b/clock/Library/Artifacts/43/43babf34dccad4fe1f88584d105082ac new file mode 100644 index 00000000..caa76368 Binary files /dev/null and b/clock/Library/Artifacts/43/43babf34dccad4fe1f88584d105082ac differ diff --git a/clock/Library/Artifacts/44/442008120df8dad56a5b2533747c016e b/clock/Library/Artifacts/44/442008120df8dad56a5b2533747c016e new file mode 100644 index 00000000..43da6efc Binary files /dev/null and b/clock/Library/Artifacts/44/442008120df8dad56a5b2533747c016e differ diff --git a/clock/Library/Artifacts/44/443e663ca836b527d9b86eb301bb6bbb b/clock/Library/Artifacts/44/443e663ca836b527d9b86eb301bb6bbb new file mode 100644 index 00000000..8b806b01 Binary files /dev/null and b/clock/Library/Artifacts/44/443e663ca836b527d9b86eb301bb6bbb differ diff --git a/clock/Library/Artifacts/44/4461986e9c7cf1cf69f6a2975d9748a9 b/clock/Library/Artifacts/44/4461986e9c7cf1cf69f6a2975d9748a9 new file mode 100644 index 00000000..3c15c483 Binary files /dev/null and b/clock/Library/Artifacts/44/4461986e9c7cf1cf69f6a2975d9748a9 differ diff --git a/clock/Library/Artifacts/44/446b7b1458f29fc546fa6df3e6b8525d b/clock/Library/Artifacts/44/446b7b1458f29fc546fa6df3e6b8525d new file mode 100644 index 00000000..25c57036 Binary files /dev/null and b/clock/Library/Artifacts/44/446b7b1458f29fc546fa6df3e6b8525d differ diff --git a/clock/Library/Artifacts/44/44994147ccd00a0d640878acfc667e17 b/clock/Library/Artifacts/44/44994147ccd00a0d640878acfc667e17 new file mode 100644 index 00000000..f6f261c8 Binary files /dev/null and b/clock/Library/Artifacts/44/44994147ccd00a0d640878acfc667e17 differ diff --git a/clock/Library/Artifacts/44/449e9d185787fb9e875bad567d43da85 b/clock/Library/Artifacts/44/449e9d185787fb9e875bad567d43da85 new file mode 100644 index 00000000..964046dd Binary files /dev/null and b/clock/Library/Artifacts/44/449e9d185787fb9e875bad567d43da85 differ diff --git a/clock/Library/Artifacts/44/449fdf3f4158522d9b37b3a71503ecfd b/clock/Library/Artifacts/44/449fdf3f4158522d9b37b3a71503ecfd new file mode 100644 index 00000000..db64be0d Binary files /dev/null and b/clock/Library/Artifacts/44/449fdf3f4158522d9b37b3a71503ecfd differ diff --git a/clock/Library/Artifacts/44/44a100cc12be2a7477ff1f4150d2e8ee b/clock/Library/Artifacts/44/44a100cc12be2a7477ff1f4150d2e8ee new file mode 100644 index 00000000..2b7fe132 Binary files /dev/null and b/clock/Library/Artifacts/44/44a100cc12be2a7477ff1f4150d2e8ee differ diff --git a/clock/Library/Artifacts/44/44c6a1f25a2338d0e8f069da77b197cf b/clock/Library/Artifacts/44/44c6a1f25a2338d0e8f069da77b197cf new file mode 100644 index 00000000..962367fa Binary files /dev/null and b/clock/Library/Artifacts/44/44c6a1f25a2338d0e8f069da77b197cf differ diff --git a/clock/Library/Artifacts/44/44d8bdd862d9c0ab834ce83b53c27d76 b/clock/Library/Artifacts/44/44d8bdd862d9c0ab834ce83b53c27d76 new file mode 100644 index 00000000..5252609e Binary files /dev/null and b/clock/Library/Artifacts/44/44d8bdd862d9c0ab834ce83b53c27d76 differ diff --git a/clock/Library/Artifacts/44/44f5c54cf400c4b8b057e3a71a2d5b3d b/clock/Library/Artifacts/44/44f5c54cf400c4b8b057e3a71a2d5b3d new file mode 100644 index 00000000..da2144d0 Binary files /dev/null and b/clock/Library/Artifacts/44/44f5c54cf400c4b8b057e3a71a2d5b3d differ diff --git a/clock/Library/Artifacts/45/451a6340778b013572c3a7516e1a844b b/clock/Library/Artifacts/45/451a6340778b013572c3a7516e1a844b new file mode 100644 index 00000000..eac097fd Binary files /dev/null and b/clock/Library/Artifacts/45/451a6340778b013572c3a7516e1a844b differ diff --git a/clock/Library/Artifacts/45/451ff88d0441d72891f1bd591f3b78b3 b/clock/Library/Artifacts/45/451ff88d0441d72891f1bd591f3b78b3 new file mode 100644 index 00000000..fc5a5e76 Binary files /dev/null and b/clock/Library/Artifacts/45/451ff88d0441d72891f1bd591f3b78b3 differ diff --git a/clock/Library/Artifacts/45/4529bd0b91f4d1dd588325ed99746598 b/clock/Library/Artifacts/45/4529bd0b91f4d1dd588325ed99746598 new file mode 100644 index 00000000..63e91b1d Binary files /dev/null and b/clock/Library/Artifacts/45/4529bd0b91f4d1dd588325ed99746598 differ diff --git a/clock/Library/Artifacts/45/4552a3961af0326fd3539f2f20c838bf b/clock/Library/Artifacts/45/4552a3961af0326fd3539f2f20c838bf new file mode 100644 index 00000000..cd672d64 Binary files /dev/null and b/clock/Library/Artifacts/45/4552a3961af0326fd3539f2f20c838bf differ diff --git a/clock/Library/Artifacts/45/455b1e9a6cff2447a23e1cbca028f0b5 b/clock/Library/Artifacts/45/455b1e9a6cff2447a23e1cbca028f0b5 new file mode 100644 index 00000000..1924bbf1 Binary files /dev/null and b/clock/Library/Artifacts/45/455b1e9a6cff2447a23e1cbca028f0b5 differ diff --git a/clock/Library/Artifacts/45/456a2ebdeae6b7d3e24152c2f3582194 b/clock/Library/Artifacts/45/456a2ebdeae6b7d3e24152c2f3582194 new file mode 100644 index 00000000..3cb52181 Binary files /dev/null and b/clock/Library/Artifacts/45/456a2ebdeae6b7d3e24152c2f3582194 differ diff --git a/clock/Library/Artifacts/45/4594ccc985801abe5b1837c113e808b5 b/clock/Library/Artifacts/45/4594ccc985801abe5b1837c113e808b5 new file mode 100644 index 00000000..b3b8135f Binary files /dev/null and b/clock/Library/Artifacts/45/4594ccc985801abe5b1837c113e808b5 differ diff --git a/clock/Library/Artifacts/45/45b861d4b9e0a2c2b48922b88fb8d50d b/clock/Library/Artifacts/45/45b861d4b9e0a2c2b48922b88fb8d50d new file mode 100644 index 00000000..2ccc3bb6 Binary files /dev/null and b/clock/Library/Artifacts/45/45b861d4b9e0a2c2b48922b88fb8d50d differ diff --git a/clock/Library/Artifacts/45/45d4120ae542132f79fd3882f2adffe9 b/clock/Library/Artifacts/45/45d4120ae542132f79fd3882f2adffe9 new file mode 100644 index 00000000..36df10aa Binary files /dev/null and b/clock/Library/Artifacts/45/45d4120ae542132f79fd3882f2adffe9 differ diff --git a/clock/Library/Artifacts/46/4661f76a9e8f366502265bc2ffa55f05 b/clock/Library/Artifacts/46/4661f76a9e8f366502265bc2ffa55f05 new file mode 100644 index 00000000..62352f78 Binary files /dev/null and b/clock/Library/Artifacts/46/4661f76a9e8f366502265bc2ffa55f05 differ diff --git a/clock/Library/Artifacts/46/467cee447afe31413332dc1eaa33e3c8 b/clock/Library/Artifacts/46/467cee447afe31413332dc1eaa33e3c8 new file mode 100644 index 00000000..f4ea29d9 Binary files /dev/null and b/clock/Library/Artifacts/46/467cee447afe31413332dc1eaa33e3c8 differ diff --git a/clock/Library/Artifacts/46/4683472b8f106cc886f2d4509adfae7f b/clock/Library/Artifacts/46/4683472b8f106cc886f2d4509adfae7f new file mode 100644 index 00000000..7631dd40 Binary files /dev/null and b/clock/Library/Artifacts/46/4683472b8f106cc886f2d4509adfae7f differ diff --git a/clock/Library/Artifacts/47/4750fc68a693383c5ba2a007a354fcc0 b/clock/Library/Artifacts/47/4750fc68a693383c5ba2a007a354fcc0 new file mode 100644 index 00000000..1fb71825 Binary files /dev/null and b/clock/Library/Artifacts/47/4750fc68a693383c5ba2a007a354fcc0 differ diff --git a/clock/Library/Artifacts/47/4775e4a018932639704c718b097c2432 b/clock/Library/Artifacts/47/4775e4a018932639704c718b097c2432 new file mode 100644 index 00000000..a62efa4e Binary files /dev/null and b/clock/Library/Artifacts/47/4775e4a018932639704c718b097c2432 differ diff --git a/clock/Library/Artifacts/47/477c8a55ec503e1c5f7e8a1866a0d98b b/clock/Library/Artifacts/47/477c8a55ec503e1c5f7e8a1866a0d98b new file mode 100644 index 00000000..e1082065 Binary files /dev/null and b/clock/Library/Artifacts/47/477c8a55ec503e1c5f7e8a1866a0d98b differ diff --git a/clock/Library/Artifacts/47/47dc391e69f7980451a36c99ea084d0c b/clock/Library/Artifacts/47/47dc391e69f7980451a36c99ea084d0c new file mode 100644 index 00000000..2d797f86 Binary files /dev/null and b/clock/Library/Artifacts/47/47dc391e69f7980451a36c99ea084d0c differ diff --git a/clock/Library/Artifacts/47/47e4ce80f006c6cb31fb08c0a96f50ac b/clock/Library/Artifacts/47/47e4ce80f006c6cb31fb08c0a96f50ac new file mode 100644 index 00000000..04168b0a Binary files /dev/null and b/clock/Library/Artifacts/47/47e4ce80f006c6cb31fb08c0a96f50ac differ diff --git a/clock/Library/Artifacts/48/48077c01b9bc0c38e4488b1903796289 b/clock/Library/Artifacts/48/48077c01b9bc0c38e4488b1903796289 new file mode 100644 index 00000000..5b378663 Binary files /dev/null and b/clock/Library/Artifacts/48/48077c01b9bc0c38e4488b1903796289 differ diff --git a/clock/Library/Artifacts/48/4809f4686af070f998af2b2f7f94e417 b/clock/Library/Artifacts/48/4809f4686af070f998af2b2f7f94e417 new file mode 100644 index 00000000..9d2d6a9a Binary files /dev/null and b/clock/Library/Artifacts/48/4809f4686af070f998af2b2f7f94e417 differ diff --git a/clock/Library/Artifacts/48/481423a2c2311ad662ed2a50d11eb343 b/clock/Library/Artifacts/48/481423a2c2311ad662ed2a50d11eb343 new file mode 100644 index 00000000..e2abc35e Binary files /dev/null and b/clock/Library/Artifacts/48/481423a2c2311ad662ed2a50d11eb343 differ diff --git a/clock/Library/Artifacts/48/487a412806bce85cebac873a58b5aee3 b/clock/Library/Artifacts/48/487a412806bce85cebac873a58b5aee3 new file mode 100644 index 00000000..1e078d3e Binary files /dev/null and b/clock/Library/Artifacts/48/487a412806bce85cebac873a58b5aee3 differ diff --git a/clock/Library/Artifacts/48/488137d65d8fd28f839e6bbfc4b58e04 b/clock/Library/Artifacts/48/488137d65d8fd28f839e6bbfc4b58e04 new file mode 100644 index 00000000..daa595b2 Binary files /dev/null and b/clock/Library/Artifacts/48/488137d65d8fd28f839e6bbfc4b58e04 differ diff --git a/clock/Library/Artifacts/48/4886a013e9eb6c2bfa55792c68f04d57 b/clock/Library/Artifacts/48/4886a013e9eb6c2bfa55792c68f04d57 new file mode 100644 index 00000000..063bb583 Binary files /dev/null and b/clock/Library/Artifacts/48/4886a013e9eb6c2bfa55792c68f04d57 differ diff --git a/clock/Library/Artifacts/48/48b290558bca59d09fdc7c3cafc8e215 b/clock/Library/Artifacts/48/48b290558bca59d09fdc7c3cafc8e215 new file mode 100644 index 00000000..303a9d63 Binary files /dev/null and b/clock/Library/Artifacts/48/48b290558bca59d09fdc7c3cafc8e215 differ diff --git a/clock/Library/Artifacts/48/48bb077f8cbf2e6750cb1077e6159aa2 b/clock/Library/Artifacts/48/48bb077f8cbf2e6750cb1077e6159aa2 new file mode 100644 index 00000000..8a2dfbca Binary files /dev/null and b/clock/Library/Artifacts/48/48bb077f8cbf2e6750cb1077e6159aa2 differ diff --git a/clock/Library/Artifacts/48/48e2468eaef678fa99647cdecd53b530 b/clock/Library/Artifacts/48/48e2468eaef678fa99647cdecd53b530 new file mode 100644 index 00000000..9936d971 Binary files /dev/null and b/clock/Library/Artifacts/48/48e2468eaef678fa99647cdecd53b530 differ diff --git a/clock/Library/Artifacts/49/4901b28dbd57b86986a0815a671e7e8d b/clock/Library/Artifacts/49/4901b28dbd57b86986a0815a671e7e8d new file mode 100644 index 00000000..ded476e0 Binary files /dev/null and b/clock/Library/Artifacts/49/4901b28dbd57b86986a0815a671e7e8d differ diff --git a/clock/Library/Artifacts/49/4922cc477887ed5e9fcd7441d66da1bd b/clock/Library/Artifacts/49/4922cc477887ed5e9fcd7441d66da1bd new file mode 100644 index 00000000..22f6af05 Binary files /dev/null and b/clock/Library/Artifacts/49/4922cc477887ed5e9fcd7441d66da1bd differ diff --git a/clock/Library/Artifacts/49/492ec71b4cbfbaf5bb1f81818e5e5aba b/clock/Library/Artifacts/49/492ec71b4cbfbaf5bb1f81818e5e5aba new file mode 100644 index 00000000..78bbde2a Binary files /dev/null and b/clock/Library/Artifacts/49/492ec71b4cbfbaf5bb1f81818e5e5aba differ diff --git a/clock/Library/Artifacts/49/4934b6766b2a13d27ba96847269d3381 b/clock/Library/Artifacts/49/4934b6766b2a13d27ba96847269d3381 new file mode 100644 index 00000000..008be77e Binary files /dev/null and b/clock/Library/Artifacts/49/4934b6766b2a13d27ba96847269d3381 differ diff --git a/clock/Library/Artifacts/49/4964acb65cf2cf7dc763e9670210c1da b/clock/Library/Artifacts/49/4964acb65cf2cf7dc763e9670210c1da new file mode 100644 index 00000000..4d9ee8df Binary files /dev/null and b/clock/Library/Artifacts/49/4964acb65cf2cf7dc763e9670210c1da differ diff --git a/clock/Library/Artifacts/49/497d934de4fc76d7df38810a7f8187ec b/clock/Library/Artifacts/49/497d934de4fc76d7df38810a7f8187ec new file mode 100644 index 00000000..374bb3d2 Binary files /dev/null and b/clock/Library/Artifacts/49/497d934de4fc76d7df38810a7f8187ec differ diff --git a/clock/Library/Artifacts/49/499d61ec866fd7d0d1a4b8c86ed42523 b/clock/Library/Artifacts/49/499d61ec866fd7d0d1a4b8c86ed42523 new file mode 100644 index 00000000..07a1c830 Binary files /dev/null and b/clock/Library/Artifacts/49/499d61ec866fd7d0d1a4b8c86ed42523 differ diff --git a/clock/Library/Artifacts/4a/4a07f3ffbdf3f22640a74c27abf08e6f b/clock/Library/Artifacts/4a/4a07f3ffbdf3f22640a74c27abf08e6f new file mode 100644 index 00000000..dc9d108e Binary files /dev/null and b/clock/Library/Artifacts/4a/4a07f3ffbdf3f22640a74c27abf08e6f differ diff --git a/clock/Library/Artifacts/4a/4a35bc67bc1992749d21ffdeeaa2dc34 b/clock/Library/Artifacts/4a/4a35bc67bc1992749d21ffdeeaa2dc34 new file mode 100644 index 00000000..7c697db9 Binary files /dev/null and b/clock/Library/Artifacts/4a/4a35bc67bc1992749d21ffdeeaa2dc34 differ diff --git a/clock/Library/Artifacts/4a/4a65a8478eecc012b6c50f907333e771 b/clock/Library/Artifacts/4a/4a65a8478eecc012b6c50f907333e771 new file mode 100644 index 00000000..a65819bd Binary files /dev/null and b/clock/Library/Artifacts/4a/4a65a8478eecc012b6c50f907333e771 differ diff --git a/clock/Library/Artifacts/4a/4a836ed442f6af21bdb2b39b7318451a b/clock/Library/Artifacts/4a/4a836ed442f6af21bdb2b39b7318451a new file mode 100644 index 00000000..17d0d682 Binary files /dev/null and b/clock/Library/Artifacts/4a/4a836ed442f6af21bdb2b39b7318451a differ diff --git a/clock/Library/Artifacts/4a/4aa34b2dc2f164611ad271ed78156f6a b/clock/Library/Artifacts/4a/4aa34b2dc2f164611ad271ed78156f6a new file mode 100644 index 00000000..045a96cb Binary files /dev/null and b/clock/Library/Artifacts/4a/4aa34b2dc2f164611ad271ed78156f6a differ diff --git a/clock/Library/Artifacts/4b/4b23067f988cb218c063e8ec60e5329f b/clock/Library/Artifacts/4b/4b23067f988cb218c063e8ec60e5329f new file mode 100644 index 00000000..b3b61372 Binary files /dev/null and b/clock/Library/Artifacts/4b/4b23067f988cb218c063e8ec60e5329f differ diff --git a/clock/Library/Artifacts/4b/4b790493bf2323ac64572de769a5d2e8 b/clock/Library/Artifacts/4b/4b790493bf2323ac64572de769a5d2e8 new file mode 100644 index 00000000..5964c22b Binary files /dev/null and b/clock/Library/Artifacts/4b/4b790493bf2323ac64572de769a5d2e8 differ diff --git a/clock/Library/Artifacts/4b/4b82c2233eaa93c84ff9a36ec1d455c3 b/clock/Library/Artifacts/4b/4b82c2233eaa93c84ff9a36ec1d455c3 new file mode 100644 index 00000000..18b4ff8b Binary files /dev/null and b/clock/Library/Artifacts/4b/4b82c2233eaa93c84ff9a36ec1d455c3 differ diff --git a/clock/Library/Artifacts/4b/4b8ba1fcc2bd3eb75ec6f7299c745942 b/clock/Library/Artifacts/4b/4b8ba1fcc2bd3eb75ec6f7299c745942 new file mode 100644 index 00000000..6e386deb Binary files /dev/null and b/clock/Library/Artifacts/4b/4b8ba1fcc2bd3eb75ec6f7299c745942 differ diff --git a/clock/Library/Artifacts/4b/4bcafbf08909a5c357371052814536fb b/clock/Library/Artifacts/4b/4bcafbf08909a5c357371052814536fb new file mode 100644 index 00000000..a3a32b44 Binary files /dev/null and b/clock/Library/Artifacts/4b/4bcafbf08909a5c357371052814536fb differ diff --git a/clock/Library/Artifacts/4b/4bfa2aad822fb587c65cc173dca9e86e b/clock/Library/Artifacts/4b/4bfa2aad822fb587c65cc173dca9e86e new file mode 100644 index 00000000..881809e9 Binary files /dev/null and b/clock/Library/Artifacts/4b/4bfa2aad822fb587c65cc173dca9e86e differ diff --git a/clock/Library/Artifacts/4b/4bfc0440b48d95a7f13d3ecc815c071c b/clock/Library/Artifacts/4b/4bfc0440b48d95a7f13d3ecc815c071c new file mode 100644 index 00000000..9830bbb6 Binary files /dev/null and b/clock/Library/Artifacts/4b/4bfc0440b48d95a7f13d3ecc815c071c differ diff --git a/clock/Library/Artifacts/4c/4c00dd29ae36fd33151d89653504006d b/clock/Library/Artifacts/4c/4c00dd29ae36fd33151d89653504006d new file mode 100644 index 00000000..26623acc Binary files /dev/null and b/clock/Library/Artifacts/4c/4c00dd29ae36fd33151d89653504006d differ diff --git a/clock/Library/Artifacts/4c/4c2571e185d659e48fb0fbb3581ada42 b/clock/Library/Artifacts/4c/4c2571e185d659e48fb0fbb3581ada42 new file mode 100644 index 00000000..a3b75a59 Binary files /dev/null and b/clock/Library/Artifacts/4c/4c2571e185d659e48fb0fbb3581ada42 differ diff --git a/clock/Library/Artifacts/4c/4c467ac4206e61b01baaad1781751d43 b/clock/Library/Artifacts/4c/4c467ac4206e61b01baaad1781751d43 new file mode 100644 index 00000000..2d9d4713 Binary files /dev/null and b/clock/Library/Artifacts/4c/4c467ac4206e61b01baaad1781751d43 differ diff --git a/clock/Library/Artifacts/4c/4cb1d2a46ab5852a077260a6fda450d8 b/clock/Library/Artifacts/4c/4cb1d2a46ab5852a077260a6fda450d8 new file mode 100644 index 00000000..aa7ac474 Binary files /dev/null and b/clock/Library/Artifacts/4c/4cb1d2a46ab5852a077260a6fda450d8 differ diff --git a/clock/Library/Artifacts/4c/4ce8233af2e72896a926a3e6a1649486 b/clock/Library/Artifacts/4c/4ce8233af2e72896a926a3e6a1649486 new file mode 100644 index 00000000..629e6302 Binary files /dev/null and b/clock/Library/Artifacts/4c/4ce8233af2e72896a926a3e6a1649486 differ diff --git a/clock/Library/Artifacts/4c/4cf414e4c62e3a5646eb5e693014e899 b/clock/Library/Artifacts/4c/4cf414e4c62e3a5646eb5e693014e899 new file mode 100644 index 00000000..d60bf437 Binary files /dev/null and b/clock/Library/Artifacts/4c/4cf414e4c62e3a5646eb5e693014e899 differ diff --git a/clock/Library/Artifacts/4d/4d4ae9cf872d4985a01e31974998c252 b/clock/Library/Artifacts/4d/4d4ae9cf872d4985a01e31974998c252 new file mode 100644 index 00000000..d3d21673 Binary files /dev/null and b/clock/Library/Artifacts/4d/4d4ae9cf872d4985a01e31974998c252 differ diff --git a/clock/Library/Artifacts/4d/4d60a1a4d0155af4b81bd3c8617c0b65 b/clock/Library/Artifacts/4d/4d60a1a4d0155af4b81bd3c8617c0b65 new file mode 100644 index 00000000..811c91ce Binary files /dev/null and b/clock/Library/Artifacts/4d/4d60a1a4d0155af4b81bd3c8617c0b65 differ diff --git a/clock/Library/Artifacts/4d/4d6146121896f23d343bbff89979dc9a b/clock/Library/Artifacts/4d/4d6146121896f23d343bbff89979dc9a new file mode 100644 index 00000000..37fbbf43 Binary files /dev/null and b/clock/Library/Artifacts/4d/4d6146121896f23d343bbff89979dc9a differ diff --git a/clock/Library/Artifacts/4d/4d89e455e3390018eb0a6248b759edec b/clock/Library/Artifacts/4d/4d89e455e3390018eb0a6248b759edec new file mode 100644 index 00000000..ebcdb96a Binary files /dev/null and b/clock/Library/Artifacts/4d/4d89e455e3390018eb0a6248b759edec differ diff --git a/clock/Library/Artifacts/4e/4e6bc08374397b86b03122fdab952b6f b/clock/Library/Artifacts/4e/4e6bc08374397b86b03122fdab952b6f new file mode 100644 index 00000000..3e1756ba Binary files /dev/null and b/clock/Library/Artifacts/4e/4e6bc08374397b86b03122fdab952b6f differ diff --git a/clock/Library/Artifacts/4f/4f08b6d0819278f073d89eea859ce8bf b/clock/Library/Artifacts/4f/4f08b6d0819278f073d89eea859ce8bf new file mode 100644 index 00000000..f1e23f32 Binary files /dev/null and b/clock/Library/Artifacts/4f/4f08b6d0819278f073d89eea859ce8bf differ diff --git a/clock/Library/Artifacts/4f/4f39b71e14b848353011e0aa8ea2683c b/clock/Library/Artifacts/4f/4f39b71e14b848353011e0aa8ea2683c new file mode 100644 index 00000000..14617ee2 Binary files /dev/null and b/clock/Library/Artifacts/4f/4f39b71e14b848353011e0aa8ea2683c differ diff --git a/clock/Library/Artifacts/4f/4f5d2bf20d9c1153b8f81538a5bb4db3 b/clock/Library/Artifacts/4f/4f5d2bf20d9c1153b8f81538a5bb4db3 new file mode 100644 index 00000000..d7240040 Binary files /dev/null and b/clock/Library/Artifacts/4f/4f5d2bf20d9c1153b8f81538a5bb4db3 differ diff --git a/clock/Library/Artifacts/4f/4f97f6017b890dbc55ace51d0fa529e7 b/clock/Library/Artifacts/4f/4f97f6017b890dbc55ace51d0fa529e7 new file mode 100644 index 00000000..45105f6c Binary files /dev/null and b/clock/Library/Artifacts/4f/4f97f6017b890dbc55ace51d0fa529e7 differ diff --git a/clock/Library/Artifacts/4f/4fbfc528bdfc3edec99c6740dddd9157 b/clock/Library/Artifacts/4f/4fbfc528bdfc3edec99c6740dddd9157 new file mode 100644 index 00000000..4466abd6 Binary files /dev/null and b/clock/Library/Artifacts/4f/4fbfc528bdfc3edec99c6740dddd9157 differ diff --git a/clock/Library/Artifacts/50/5023936511eec88e45f79a77467462b8 b/clock/Library/Artifacts/50/5023936511eec88e45f79a77467462b8 new file mode 100644 index 00000000..faa9b217 Binary files /dev/null and b/clock/Library/Artifacts/50/5023936511eec88e45f79a77467462b8 differ diff --git a/clock/Library/Artifacts/50/503a2e14a21b7462e2311ce7edc01f19 b/clock/Library/Artifacts/50/503a2e14a21b7462e2311ce7edc01f19 new file mode 100644 index 00000000..fe673949 Binary files /dev/null and b/clock/Library/Artifacts/50/503a2e14a21b7462e2311ce7edc01f19 differ diff --git a/clock/Library/Artifacts/50/5048b14fe703d35dcf1b98668ce2ff12 b/clock/Library/Artifacts/50/5048b14fe703d35dcf1b98668ce2ff12 new file mode 100644 index 00000000..2d302766 Binary files /dev/null and b/clock/Library/Artifacts/50/5048b14fe703d35dcf1b98668ce2ff12 differ diff --git a/clock/Library/Artifacts/50/5054ce4e6f359e55137c1dfe330db6d4 b/clock/Library/Artifacts/50/5054ce4e6f359e55137c1dfe330db6d4 new file mode 100644 index 00000000..08f3b937 Binary files /dev/null and b/clock/Library/Artifacts/50/5054ce4e6f359e55137c1dfe330db6d4 differ diff --git a/clock/Library/Artifacts/50/508261093d08cd4284bfe1e25339af58 b/clock/Library/Artifacts/50/508261093d08cd4284bfe1e25339af58 new file mode 100644 index 00000000..4e05b29f Binary files /dev/null and b/clock/Library/Artifacts/50/508261093d08cd4284bfe1e25339af58 differ diff --git a/clock/Library/Artifacts/50/508322b76c1a92477297df75b179d0e3 b/clock/Library/Artifacts/50/508322b76c1a92477297df75b179d0e3 new file mode 100644 index 00000000..389efe76 Binary files /dev/null and b/clock/Library/Artifacts/50/508322b76c1a92477297df75b179d0e3 differ diff --git a/clock/Library/Artifacts/50/50a92b8d491e9e895108f61fe9805bc0 b/clock/Library/Artifacts/50/50a92b8d491e9e895108f61fe9805bc0 new file mode 100644 index 00000000..69f56bbd Binary files /dev/null and b/clock/Library/Artifacts/50/50a92b8d491e9e895108f61fe9805bc0 differ diff --git a/clock/Library/Artifacts/50/50efee8f1bb854f36130efd160475451 b/clock/Library/Artifacts/50/50efee8f1bb854f36130efd160475451 new file mode 100644 index 00000000..43e06618 Binary files /dev/null and b/clock/Library/Artifacts/50/50efee8f1bb854f36130efd160475451 differ diff --git a/clock/Library/Artifacts/51/516017fdd67cc33e78116dde00ffdc3b b/clock/Library/Artifacts/51/516017fdd67cc33e78116dde00ffdc3b new file mode 100644 index 00000000..dcc5ef0d Binary files /dev/null and b/clock/Library/Artifacts/51/516017fdd67cc33e78116dde00ffdc3b differ diff --git a/clock/Library/Artifacts/51/516dc10881b9a5a104434fe1c2d62ffa b/clock/Library/Artifacts/51/516dc10881b9a5a104434fe1c2d62ffa new file mode 100644 index 00000000..ba8b7416 Binary files /dev/null and b/clock/Library/Artifacts/51/516dc10881b9a5a104434fe1c2d62ffa differ diff --git a/clock/Library/Artifacts/51/5187a5e095124039224736d5a4e4a81a b/clock/Library/Artifacts/51/5187a5e095124039224736d5a4e4a81a new file mode 100644 index 00000000..9d767f64 Binary files /dev/null and b/clock/Library/Artifacts/51/5187a5e095124039224736d5a4e4a81a differ diff --git a/clock/Library/Artifacts/51/51919153b8220256ce96ac2f6818ab06 b/clock/Library/Artifacts/51/51919153b8220256ce96ac2f6818ab06 new file mode 100644 index 00000000..318c935f Binary files /dev/null and b/clock/Library/Artifacts/51/51919153b8220256ce96ac2f6818ab06 differ diff --git a/clock/Library/Artifacts/51/51bcb466929fc098fbdd3a789a3cc820 b/clock/Library/Artifacts/51/51bcb466929fc098fbdd3a789a3cc820 new file mode 100644 index 00000000..cd584598 Binary files /dev/null and b/clock/Library/Artifacts/51/51bcb466929fc098fbdd3a789a3cc820 differ diff --git a/clock/Library/Artifacts/51/51dbc83dbebe788deeb055f6fd860cbb b/clock/Library/Artifacts/51/51dbc83dbebe788deeb055f6fd860cbb new file mode 100644 index 00000000..9092f0ed Binary files /dev/null and b/clock/Library/Artifacts/51/51dbc83dbebe788deeb055f6fd860cbb differ diff --git a/clock/Library/Artifacts/52/52a44ce91081bb879e5d7d50d5ef92de b/clock/Library/Artifacts/52/52a44ce91081bb879e5d7d50d5ef92de new file mode 100644 index 00000000..2a916c4c Binary files /dev/null and b/clock/Library/Artifacts/52/52a44ce91081bb879e5d7d50d5ef92de differ diff --git a/clock/Library/Artifacts/52/52ce8a493205301ac758abb318f8348b b/clock/Library/Artifacts/52/52ce8a493205301ac758abb318f8348b new file mode 100644 index 00000000..0a13d4bc Binary files /dev/null and b/clock/Library/Artifacts/52/52ce8a493205301ac758abb318f8348b differ diff --git a/clock/Library/Artifacts/52/52eba02e79479af7095f3519c16aec0e b/clock/Library/Artifacts/52/52eba02e79479af7095f3519c16aec0e new file mode 100644 index 00000000..28de9b4f Binary files /dev/null and b/clock/Library/Artifacts/52/52eba02e79479af7095f3519c16aec0e differ diff --git a/clock/Library/Artifacts/52/52faffbd5654c2e6f7deac0f6d5799b6 b/clock/Library/Artifacts/52/52faffbd5654c2e6f7deac0f6d5799b6 new file mode 100644 index 00000000..21ea49b7 Binary files /dev/null and b/clock/Library/Artifacts/52/52faffbd5654c2e6f7deac0f6d5799b6 differ diff --git a/clock/Library/Artifacts/52/52ffbc72213f6806d99525c3c8e103db b/clock/Library/Artifacts/52/52ffbc72213f6806d99525c3c8e103db new file mode 100644 index 00000000..2e4d0535 Binary files /dev/null and b/clock/Library/Artifacts/52/52ffbc72213f6806d99525c3c8e103db differ diff --git a/clock/Library/Artifacts/53/532bde0ac38f0d41883ac0a76100798d b/clock/Library/Artifacts/53/532bde0ac38f0d41883ac0a76100798d new file mode 100644 index 00000000..34211ce4 Binary files /dev/null and b/clock/Library/Artifacts/53/532bde0ac38f0d41883ac0a76100798d differ diff --git a/clock/Library/Artifacts/53/53774383bc52cb55258e4d7bc667e291 b/clock/Library/Artifacts/53/53774383bc52cb55258e4d7bc667e291 new file mode 100644 index 00000000..4d42c3d3 Binary files /dev/null and b/clock/Library/Artifacts/53/53774383bc52cb55258e4d7bc667e291 differ diff --git a/clock/Library/Artifacts/53/539c24dec0082d9f0bfe42835dd717ff b/clock/Library/Artifacts/53/539c24dec0082d9f0bfe42835dd717ff new file mode 100644 index 00000000..d6538236 Binary files /dev/null and b/clock/Library/Artifacts/53/539c24dec0082d9f0bfe42835dd717ff differ diff --git a/clock/Library/Artifacts/53/53c70946a2500146dcf76459f0033800 b/clock/Library/Artifacts/53/53c70946a2500146dcf76459f0033800 new file mode 100644 index 00000000..ddea045a Binary files /dev/null and b/clock/Library/Artifacts/53/53c70946a2500146dcf76459f0033800 differ diff --git a/clock/Library/Artifacts/53/53c85e67f72f414d8ccbc610f67e588b b/clock/Library/Artifacts/53/53c85e67f72f414d8ccbc610f67e588b new file mode 100644 index 00000000..a184e921 Binary files /dev/null and b/clock/Library/Artifacts/53/53c85e67f72f414d8ccbc610f67e588b differ diff --git a/clock/Library/Artifacts/53/53eb767b9d79ac8ce6ef7c85d298eeb7 b/clock/Library/Artifacts/53/53eb767b9d79ac8ce6ef7c85d298eeb7 new file mode 100644 index 00000000..1e4456c1 Binary files /dev/null and b/clock/Library/Artifacts/53/53eb767b9d79ac8ce6ef7c85d298eeb7 differ diff --git a/clock/Library/Artifacts/54/5419b076756d89ff9b536a934fb142ac b/clock/Library/Artifacts/54/5419b076756d89ff9b536a934fb142ac new file mode 100644 index 00000000..eb95525e Binary files /dev/null and b/clock/Library/Artifacts/54/5419b076756d89ff9b536a934fb142ac differ diff --git a/clock/Library/Artifacts/54/548eb49838eb902e23dd4c2718627e50 b/clock/Library/Artifacts/54/548eb49838eb902e23dd4c2718627e50 new file mode 100644 index 00000000..8e330683 Binary files /dev/null and b/clock/Library/Artifacts/54/548eb49838eb902e23dd4c2718627e50 differ diff --git a/clock/Library/Artifacts/54/549f38469b83db63e76cd148579774be b/clock/Library/Artifacts/54/549f38469b83db63e76cd148579774be new file mode 100644 index 00000000..b6263e63 Binary files /dev/null and b/clock/Library/Artifacts/54/549f38469b83db63e76cd148579774be differ diff --git a/clock/Library/Artifacts/54/54fb83796fefc4a2ae7e7ea983e0606e b/clock/Library/Artifacts/54/54fb83796fefc4a2ae7e7ea983e0606e new file mode 100644 index 00000000..46dd9d8c Binary files /dev/null and b/clock/Library/Artifacts/54/54fb83796fefc4a2ae7e7ea983e0606e differ diff --git a/clock/Library/Artifacts/55/550753f15ca7ec1afa2eb61c8ac09495 b/clock/Library/Artifacts/55/550753f15ca7ec1afa2eb61c8ac09495 new file mode 100644 index 00000000..2724cb44 Binary files /dev/null and b/clock/Library/Artifacts/55/550753f15ca7ec1afa2eb61c8ac09495 differ diff --git a/clock/Library/Artifacts/55/553396e7977b9122d2f86114b148b1bd b/clock/Library/Artifacts/55/553396e7977b9122d2f86114b148b1bd new file mode 100644 index 00000000..0d743d75 Binary files /dev/null and b/clock/Library/Artifacts/55/553396e7977b9122d2f86114b148b1bd differ diff --git a/clock/Library/Artifacts/55/55462c0d7649d79119ed44d6164dad3a b/clock/Library/Artifacts/55/55462c0d7649d79119ed44d6164dad3a new file mode 100644 index 00000000..2355aa15 Binary files /dev/null and b/clock/Library/Artifacts/55/55462c0d7649d79119ed44d6164dad3a differ diff --git a/clock/Library/Artifacts/55/55a318d58fa2c8736b65ebffe8005c74 b/clock/Library/Artifacts/55/55a318d58fa2c8736b65ebffe8005c74 new file mode 100644 index 00000000..ede4b389 Binary files /dev/null and b/clock/Library/Artifacts/55/55a318d58fa2c8736b65ebffe8005c74 differ diff --git a/clock/Library/Artifacts/55/55a4188e153aad27130995a2f8930d13 b/clock/Library/Artifacts/55/55a4188e153aad27130995a2f8930d13 new file mode 100644 index 00000000..1a5ada77 Binary files /dev/null and b/clock/Library/Artifacts/55/55a4188e153aad27130995a2f8930d13 differ diff --git a/clock/Library/Artifacts/55/55ab34fb0efd598a0e2f1bd7635212cc b/clock/Library/Artifacts/55/55ab34fb0efd598a0e2f1bd7635212cc new file mode 100644 index 00000000..fdc6d514 Binary files /dev/null and b/clock/Library/Artifacts/55/55ab34fb0efd598a0e2f1bd7635212cc differ diff --git a/clock/Library/Artifacts/55/55ca590e0410d10315ebb9db26097444 b/clock/Library/Artifacts/55/55ca590e0410d10315ebb9db26097444 new file mode 100644 index 00000000..b531d577 Binary files /dev/null and b/clock/Library/Artifacts/55/55ca590e0410d10315ebb9db26097444 differ diff --git a/clock/Library/Artifacts/55/55e2fb40a9b914c6ffa253c1a2fa653e b/clock/Library/Artifacts/55/55e2fb40a9b914c6ffa253c1a2fa653e new file mode 100644 index 00000000..3acaf770 Binary files /dev/null and b/clock/Library/Artifacts/55/55e2fb40a9b914c6ffa253c1a2fa653e differ diff --git a/clock/Library/Artifacts/56/565688339a67d047e638df0b5a603335 b/clock/Library/Artifacts/56/565688339a67d047e638df0b5a603335 new file mode 100644 index 00000000..8fafd56c Binary files /dev/null and b/clock/Library/Artifacts/56/565688339a67d047e638df0b5a603335 differ diff --git a/clock/Library/Artifacts/56/565d348be3501d2842dd77272d4c3009 b/clock/Library/Artifacts/56/565d348be3501d2842dd77272d4c3009 new file mode 100644 index 00000000..732e5f5b Binary files /dev/null and b/clock/Library/Artifacts/56/565d348be3501d2842dd77272d4c3009 differ diff --git a/clock/Library/Artifacts/56/5677af9ffb8921ebb27fbf491e139d0c b/clock/Library/Artifacts/56/5677af9ffb8921ebb27fbf491e139d0c new file mode 100644 index 00000000..6f143810 Binary files /dev/null and b/clock/Library/Artifacts/56/5677af9ffb8921ebb27fbf491e139d0c differ diff --git a/clock/Library/Artifacts/56/56974706b0942c7626413b07dcb93998 b/clock/Library/Artifacts/56/56974706b0942c7626413b07dcb93998 new file mode 100644 index 00000000..8c5f4dfe Binary files /dev/null and b/clock/Library/Artifacts/56/56974706b0942c7626413b07dcb93998 differ diff --git a/clock/Library/Artifacts/57/57ba7d1742cd9ccf631198646d323129 b/clock/Library/Artifacts/57/57ba7d1742cd9ccf631198646d323129 new file mode 100644 index 00000000..82827f60 Binary files /dev/null and b/clock/Library/Artifacts/57/57ba7d1742cd9ccf631198646d323129 differ diff --git a/clock/Library/Artifacts/57/57f0e540c1835e75922d614b99ed3e6e b/clock/Library/Artifacts/57/57f0e540c1835e75922d614b99ed3e6e new file mode 100644 index 00000000..e7e5602d Binary files /dev/null and b/clock/Library/Artifacts/57/57f0e540c1835e75922d614b99ed3e6e differ diff --git a/clock/Library/Artifacts/57/57ff44cdc73b1d2f2d26b3c934ba5821 b/clock/Library/Artifacts/57/57ff44cdc73b1d2f2d26b3c934ba5821 new file mode 100644 index 00000000..6fad0d04 Binary files /dev/null and b/clock/Library/Artifacts/57/57ff44cdc73b1d2f2d26b3c934ba5821 differ diff --git a/clock/Library/Artifacts/58/583ab68e44536e1fe8ca78bb38322525 b/clock/Library/Artifacts/58/583ab68e44536e1fe8ca78bb38322525 new file mode 100644 index 00000000..b52c2b69 Binary files /dev/null and b/clock/Library/Artifacts/58/583ab68e44536e1fe8ca78bb38322525 differ diff --git a/clock/Library/Artifacts/58/586d002d717ed790c92f2eb5ea949d0d b/clock/Library/Artifacts/58/586d002d717ed790c92f2eb5ea949d0d new file mode 100644 index 00000000..88c46ef8 Binary files /dev/null and b/clock/Library/Artifacts/58/586d002d717ed790c92f2eb5ea949d0d differ diff --git a/clock/Library/Artifacts/58/58bb074dca228a53c4452f5dcb40ec79 b/clock/Library/Artifacts/58/58bb074dca228a53c4452f5dcb40ec79 new file mode 100644 index 00000000..8f6a25e9 Binary files /dev/null and b/clock/Library/Artifacts/58/58bb074dca228a53c4452f5dcb40ec79 differ diff --git a/clock/Library/Artifacts/58/58be15e439b7acb553b6032bb02c7371 b/clock/Library/Artifacts/58/58be15e439b7acb553b6032bb02c7371 new file mode 100644 index 00000000..d9dda2c4 Binary files /dev/null and b/clock/Library/Artifacts/58/58be15e439b7acb553b6032bb02c7371 differ diff --git a/clock/Library/Artifacts/58/58c62b2e622522bea696c4906cf75d05 b/clock/Library/Artifacts/58/58c62b2e622522bea696c4906cf75d05 new file mode 100644 index 00000000..085d5829 Binary files /dev/null and b/clock/Library/Artifacts/58/58c62b2e622522bea696c4906cf75d05 differ diff --git a/clock/Library/Artifacts/58/58ca184cf1be70a178c03977f34c80df b/clock/Library/Artifacts/58/58ca184cf1be70a178c03977f34c80df new file mode 100644 index 00000000..38d94404 Binary files /dev/null and b/clock/Library/Artifacts/58/58ca184cf1be70a178c03977f34c80df differ diff --git a/clock/Library/Artifacts/58/58d46fdcf88a81b19fc5e4017056a17c b/clock/Library/Artifacts/58/58d46fdcf88a81b19fc5e4017056a17c new file mode 100644 index 00000000..443d7c86 Binary files /dev/null and b/clock/Library/Artifacts/58/58d46fdcf88a81b19fc5e4017056a17c differ diff --git a/clock/Library/Artifacts/58/58e0bd22add46ced23c618bbad1d0904 b/clock/Library/Artifacts/58/58e0bd22add46ced23c618bbad1d0904 new file mode 100644 index 00000000..ed13de54 Binary files /dev/null and b/clock/Library/Artifacts/58/58e0bd22add46ced23c618bbad1d0904 differ diff --git a/clock/Library/Artifacts/59/5944a8a4b874dd0fd8c725f417ba339c b/clock/Library/Artifacts/59/5944a8a4b874dd0fd8c725f417ba339c new file mode 100644 index 00000000..87b044a9 Binary files /dev/null and b/clock/Library/Artifacts/59/5944a8a4b874dd0fd8c725f417ba339c differ diff --git a/clock/Library/Artifacts/59/59f13c631c6a0e2f29836639cbdac853 b/clock/Library/Artifacts/59/59f13c631c6a0e2f29836639cbdac853 new file mode 100644 index 00000000..e34e1067 Binary files /dev/null and b/clock/Library/Artifacts/59/59f13c631c6a0e2f29836639cbdac853 differ diff --git a/clock/Library/Artifacts/5a/5a562040b4b8fc3471a2e37caa0f924f b/clock/Library/Artifacts/5a/5a562040b4b8fc3471a2e37caa0f924f new file mode 100644 index 00000000..2060c0ca Binary files /dev/null and b/clock/Library/Artifacts/5a/5a562040b4b8fc3471a2e37caa0f924f differ diff --git a/clock/Library/Artifacts/5a/5a568802cedaf6af8f4fdc3ce79c8292 b/clock/Library/Artifacts/5a/5a568802cedaf6af8f4fdc3ce79c8292 new file mode 100644 index 00000000..cbdb1ec4 Binary files /dev/null and b/clock/Library/Artifacts/5a/5a568802cedaf6af8f4fdc3ce79c8292 differ diff --git a/clock/Library/Artifacts/5a/5a5ad2276e9c11914afb3183fd9f6843 b/clock/Library/Artifacts/5a/5a5ad2276e9c11914afb3183fd9f6843 new file mode 100644 index 00000000..b1d19510 Binary files /dev/null and b/clock/Library/Artifacts/5a/5a5ad2276e9c11914afb3183fd9f6843 differ diff --git a/clock/Library/Artifacts/5a/5a61ac0a10574d3e4d75402ad8c8d1bd b/clock/Library/Artifacts/5a/5a61ac0a10574d3e4d75402ad8c8d1bd new file mode 100644 index 00000000..ee42b4e7 Binary files /dev/null and b/clock/Library/Artifacts/5a/5a61ac0a10574d3e4d75402ad8c8d1bd differ diff --git a/clock/Library/Artifacts/5a/5aa0fa949202e4ca9cd4c6ffae4eab9f b/clock/Library/Artifacts/5a/5aa0fa949202e4ca9cd4c6ffae4eab9f new file mode 100644 index 00000000..78f1d6cc Binary files /dev/null and b/clock/Library/Artifacts/5a/5aa0fa949202e4ca9cd4c6ffae4eab9f differ diff --git a/clock/Library/Artifacts/5a/5ac22b8b6892db9321524cec494d9c77 b/clock/Library/Artifacts/5a/5ac22b8b6892db9321524cec494d9c77 new file mode 100644 index 00000000..8df59960 Binary files /dev/null and b/clock/Library/Artifacts/5a/5ac22b8b6892db9321524cec494d9c77 differ diff --git a/clock/Library/Artifacts/5a/5ad610e3aed1be0d98f13599bdd1ffc8 b/clock/Library/Artifacts/5a/5ad610e3aed1be0d98f13599bdd1ffc8 new file mode 100644 index 00000000..75d76af5 Binary files /dev/null and b/clock/Library/Artifacts/5a/5ad610e3aed1be0d98f13599bdd1ffc8 differ diff --git a/clock/Library/Artifacts/5a/5ae637754a66506f13b89e3f3a86776a b/clock/Library/Artifacts/5a/5ae637754a66506f13b89e3f3a86776a new file mode 100644 index 00000000..1d277bc8 Binary files /dev/null and b/clock/Library/Artifacts/5a/5ae637754a66506f13b89e3f3a86776a differ diff --git a/clock/Library/Artifacts/5a/5ae7d9b84fa59c041f811c9d762559da b/clock/Library/Artifacts/5a/5ae7d9b84fa59c041f811c9d762559da new file mode 100644 index 00000000..5af16a72 Binary files /dev/null and b/clock/Library/Artifacts/5a/5ae7d9b84fa59c041f811c9d762559da differ diff --git a/clock/Library/Artifacts/5b/5b25c5f1eb3f283e3d0a90f55fd43a6a b/clock/Library/Artifacts/5b/5b25c5f1eb3f283e3d0a90f55fd43a6a new file mode 100644 index 00000000..ed92981f Binary files /dev/null and b/clock/Library/Artifacts/5b/5b25c5f1eb3f283e3d0a90f55fd43a6a differ diff --git a/clock/Library/Artifacts/5b/5b3cd04ce687e54649ff7da090cc84e9 b/clock/Library/Artifacts/5b/5b3cd04ce687e54649ff7da090cc84e9 new file mode 100644 index 00000000..90346c51 Binary files /dev/null and b/clock/Library/Artifacts/5b/5b3cd04ce687e54649ff7da090cc84e9 differ diff --git a/clock/Library/Artifacts/5b/5ba09fc6787877ec4442166e1bfdfa26 b/clock/Library/Artifacts/5b/5ba09fc6787877ec4442166e1bfdfa26 new file mode 100644 index 00000000..2e01276f Binary files /dev/null and b/clock/Library/Artifacts/5b/5ba09fc6787877ec4442166e1bfdfa26 differ diff --git a/clock/Library/Artifacts/5b/5bd664879013ff61af81fe81c971a6f8 b/clock/Library/Artifacts/5b/5bd664879013ff61af81fe81c971a6f8 new file mode 100644 index 00000000..81c54531 Binary files /dev/null and b/clock/Library/Artifacts/5b/5bd664879013ff61af81fe81c971a6f8 differ diff --git a/clock/Library/Artifacts/5c/5c780217d75c7b3effd9f8cc5e744183 b/clock/Library/Artifacts/5c/5c780217d75c7b3effd9f8cc5e744183 new file mode 100644 index 00000000..47dbea0a Binary files /dev/null and b/clock/Library/Artifacts/5c/5c780217d75c7b3effd9f8cc5e744183 differ diff --git a/clock/Library/Artifacts/5c/5c959948cdf2d40df14ff3bdb41dfc87 b/clock/Library/Artifacts/5c/5c959948cdf2d40df14ff3bdb41dfc87 new file mode 100644 index 00000000..e4f8b979 Binary files /dev/null and b/clock/Library/Artifacts/5c/5c959948cdf2d40df14ff3bdb41dfc87 differ diff --git a/clock/Library/Artifacts/5c/5ca85e21dadba1c02de062eeda8102c6 b/clock/Library/Artifacts/5c/5ca85e21dadba1c02de062eeda8102c6 new file mode 100644 index 00000000..608e50ce Binary files /dev/null and b/clock/Library/Artifacts/5c/5ca85e21dadba1c02de062eeda8102c6 differ diff --git a/clock/Library/Artifacts/5c/5cfa3da79aa4dab36f602655801edf3d b/clock/Library/Artifacts/5c/5cfa3da79aa4dab36f602655801edf3d new file mode 100644 index 00000000..288c085a Binary files /dev/null and b/clock/Library/Artifacts/5c/5cfa3da79aa4dab36f602655801edf3d differ diff --git a/clock/Library/Artifacts/5d/5d06e3c010f5ced81f33b48d3e81f663 b/clock/Library/Artifacts/5d/5d06e3c010f5ced81f33b48d3e81f663 new file mode 100644 index 00000000..cae6d4c3 Binary files /dev/null and b/clock/Library/Artifacts/5d/5d06e3c010f5ced81f33b48d3e81f663 differ diff --git a/clock/Library/Artifacts/5d/5d68d41657eca691f4c40abe6eec0480 b/clock/Library/Artifacts/5d/5d68d41657eca691f4c40abe6eec0480 new file mode 100644 index 00000000..02ed0195 Binary files /dev/null and b/clock/Library/Artifacts/5d/5d68d41657eca691f4c40abe6eec0480 differ diff --git a/clock/Library/Artifacts/5d/5d6f6b7d2f2939bace1b6c83d7c5dd74 b/clock/Library/Artifacts/5d/5d6f6b7d2f2939bace1b6c83d7c5dd74 new file mode 100644 index 00000000..4a94f249 Binary files /dev/null and b/clock/Library/Artifacts/5d/5d6f6b7d2f2939bace1b6c83d7c5dd74 differ diff --git a/clock/Library/Artifacts/5d/5d7fabd49299b5291ec90544b15725c3 b/clock/Library/Artifacts/5d/5d7fabd49299b5291ec90544b15725c3 new file mode 100644 index 00000000..1a82a420 Binary files /dev/null and b/clock/Library/Artifacts/5d/5d7fabd49299b5291ec90544b15725c3 differ diff --git a/clock/Library/Artifacts/5d/5dc4d889b8046f6f012671949cf0c277 b/clock/Library/Artifacts/5d/5dc4d889b8046f6f012671949cf0c277 new file mode 100644 index 00000000..213c3059 Binary files /dev/null and b/clock/Library/Artifacts/5d/5dc4d889b8046f6f012671949cf0c277 differ diff --git a/clock/Library/Artifacts/5d/5dc6a14940250ac20704164abfe52793 b/clock/Library/Artifacts/5d/5dc6a14940250ac20704164abfe52793 new file mode 100644 index 00000000..6f55991f Binary files /dev/null and b/clock/Library/Artifacts/5d/5dc6a14940250ac20704164abfe52793 differ diff --git a/clock/Library/Artifacts/5d/5dddda5fdb495d890a96e9aa924e044e b/clock/Library/Artifacts/5d/5dddda5fdb495d890a96e9aa924e044e new file mode 100644 index 00000000..82ec5ba0 Binary files /dev/null and b/clock/Library/Artifacts/5d/5dddda5fdb495d890a96e9aa924e044e differ diff --git a/clock/Library/Artifacts/5d/5dfeb99aed05e82cf15daeb88ce17817 b/clock/Library/Artifacts/5d/5dfeb99aed05e82cf15daeb88ce17817 new file mode 100644 index 00000000..73df252b Binary files /dev/null and b/clock/Library/Artifacts/5d/5dfeb99aed05e82cf15daeb88ce17817 differ diff --git a/clock/Library/Artifacts/5e/5e2b201130e82230a307e7b224349382 b/clock/Library/Artifacts/5e/5e2b201130e82230a307e7b224349382 new file mode 100644 index 00000000..c02e32e2 Binary files /dev/null and b/clock/Library/Artifacts/5e/5e2b201130e82230a307e7b224349382 differ diff --git a/clock/Library/Artifacts/5e/5e2ec100206675fcb566f704a38e2ad6 b/clock/Library/Artifacts/5e/5e2ec100206675fcb566f704a38e2ad6 new file mode 100644 index 00000000..67a0b80f Binary files /dev/null and b/clock/Library/Artifacts/5e/5e2ec100206675fcb566f704a38e2ad6 differ diff --git a/clock/Library/Artifacts/5e/5e4500bd3b7c00e45a16a1629a37b6b4 b/clock/Library/Artifacts/5e/5e4500bd3b7c00e45a16a1629a37b6b4 new file mode 100644 index 00000000..14221a22 Binary files /dev/null and b/clock/Library/Artifacts/5e/5e4500bd3b7c00e45a16a1629a37b6b4 differ diff --git a/clock/Library/Artifacts/5e/5ec25f82c75a3e1d1edba241555d678b b/clock/Library/Artifacts/5e/5ec25f82c75a3e1d1edba241555d678b new file mode 100644 index 00000000..86cbfba9 Binary files /dev/null and b/clock/Library/Artifacts/5e/5ec25f82c75a3e1d1edba241555d678b differ diff --git a/clock/Library/Artifacts/5e/5ed375e83fea86bb362a5364bd678c4c b/clock/Library/Artifacts/5e/5ed375e83fea86bb362a5364bd678c4c new file mode 100644 index 00000000..5f29c0d3 Binary files /dev/null and b/clock/Library/Artifacts/5e/5ed375e83fea86bb362a5364bd678c4c differ diff --git a/clock/Library/Artifacts/5e/5ef7f9ff238a4fa05d92385962812244 b/clock/Library/Artifacts/5e/5ef7f9ff238a4fa05d92385962812244 new file mode 100644 index 00000000..5b83cf97 Binary files /dev/null and b/clock/Library/Artifacts/5e/5ef7f9ff238a4fa05d92385962812244 differ diff --git a/clock/Library/Artifacts/5e/5efbaae1921c56d458bf06f55f30dc95 b/clock/Library/Artifacts/5e/5efbaae1921c56d458bf06f55f30dc95 new file mode 100644 index 00000000..79dd5b6e Binary files /dev/null and b/clock/Library/Artifacts/5e/5efbaae1921c56d458bf06f55f30dc95 differ diff --git a/clock/Library/Artifacts/5f/5f04fc31e4073815f26c7bff7918c7ca b/clock/Library/Artifacts/5f/5f04fc31e4073815f26c7bff7918c7ca new file mode 100644 index 00000000..fde77c14 Binary files /dev/null and b/clock/Library/Artifacts/5f/5f04fc31e4073815f26c7bff7918c7ca differ diff --git a/clock/Library/Artifacts/5f/5f0d37bad65229e5b79a1b4db60c0aab b/clock/Library/Artifacts/5f/5f0d37bad65229e5b79a1b4db60c0aab new file mode 100644 index 00000000..32785ca0 Binary files /dev/null and b/clock/Library/Artifacts/5f/5f0d37bad65229e5b79a1b4db60c0aab differ diff --git a/clock/Library/Artifacts/5f/5f1cc2f7a0c1beaf475b5872c2fa705c b/clock/Library/Artifacts/5f/5f1cc2f7a0c1beaf475b5872c2fa705c new file mode 100644 index 00000000..46829523 Binary files /dev/null and b/clock/Library/Artifacts/5f/5f1cc2f7a0c1beaf475b5872c2fa705c differ diff --git a/clock/Library/Artifacts/5f/5f1fc06236b84400680141afe8a816d6 b/clock/Library/Artifacts/5f/5f1fc06236b84400680141afe8a816d6 new file mode 100644 index 00000000..ebf27cef Binary files /dev/null and b/clock/Library/Artifacts/5f/5f1fc06236b84400680141afe8a816d6 differ diff --git a/clock/Library/Artifacts/5f/5f303a19eeb36c4f518c4921ab7f4c4f b/clock/Library/Artifacts/5f/5f303a19eeb36c4f518c4921ab7f4c4f new file mode 100644 index 00000000..68223e8d Binary files /dev/null and b/clock/Library/Artifacts/5f/5f303a19eeb36c4f518c4921ab7f4c4f differ diff --git a/clock/Library/Artifacts/5f/5f3cb2db1e037c605b74f23aa6440d53 b/clock/Library/Artifacts/5f/5f3cb2db1e037c605b74f23aa6440d53 new file mode 100644 index 00000000..31c054f4 Binary files /dev/null and b/clock/Library/Artifacts/5f/5f3cb2db1e037c605b74f23aa6440d53 differ diff --git a/clock/Library/Artifacts/5f/5f473cf185f9410e08ea801e3fe2e640 b/clock/Library/Artifacts/5f/5f473cf185f9410e08ea801e3fe2e640 new file mode 100644 index 00000000..cb6371fc Binary files /dev/null and b/clock/Library/Artifacts/5f/5f473cf185f9410e08ea801e3fe2e640 differ diff --git a/clock/Library/Artifacts/5f/5f83fc7c4c8fc88ab750f321d89c108a b/clock/Library/Artifacts/5f/5f83fc7c4c8fc88ab750f321d89c108a new file mode 100644 index 00000000..0f2b3d4f Binary files /dev/null and b/clock/Library/Artifacts/5f/5f83fc7c4c8fc88ab750f321d89c108a differ diff --git a/clock/Library/Artifacts/5f/5f893224783928139985627fbaf3ea7f b/clock/Library/Artifacts/5f/5f893224783928139985627fbaf3ea7f new file mode 100644 index 00000000..a55f2c4f Binary files /dev/null and b/clock/Library/Artifacts/5f/5f893224783928139985627fbaf3ea7f differ diff --git a/clock/Library/Artifacts/5f/5f93216b1c2b47cb871111af26d20ba7 b/clock/Library/Artifacts/5f/5f93216b1c2b47cb871111af26d20ba7 new file mode 100644 index 00000000..d2eac103 Binary files /dev/null and b/clock/Library/Artifacts/5f/5f93216b1c2b47cb871111af26d20ba7 differ diff --git a/clock/Library/Artifacts/60/6072aebe9d51ca3c2f673d285c6c58ce b/clock/Library/Artifacts/60/6072aebe9d51ca3c2f673d285c6c58ce new file mode 100644 index 00000000..b0494b89 Binary files /dev/null and b/clock/Library/Artifacts/60/6072aebe9d51ca3c2f673d285c6c58ce differ diff --git a/clock/Library/Artifacts/60/6088e193d1561df4e477b507e3c872d8 b/clock/Library/Artifacts/60/6088e193d1561df4e477b507e3c872d8 new file mode 100644 index 00000000..ed30b8b8 Binary files /dev/null and b/clock/Library/Artifacts/60/6088e193d1561df4e477b507e3c872d8 differ diff --git a/clock/Library/Artifacts/60/609017f15b60543709c1f3e8ddf2217c b/clock/Library/Artifacts/60/609017f15b60543709c1f3e8ddf2217c new file mode 100644 index 00000000..67a5c5f1 Binary files /dev/null and b/clock/Library/Artifacts/60/609017f15b60543709c1f3e8ddf2217c differ diff --git a/clock/Library/Artifacts/60/60a6077cb284d30827bf713a4659b0da b/clock/Library/Artifacts/60/60a6077cb284d30827bf713a4659b0da new file mode 100644 index 00000000..d78eb5e8 Binary files /dev/null and b/clock/Library/Artifacts/60/60a6077cb284d30827bf713a4659b0da differ diff --git a/clock/Library/Artifacts/60/60cd985753cd9c9d86c90c806d8753d6 b/clock/Library/Artifacts/60/60cd985753cd9c9d86c90c806d8753d6 new file mode 100644 index 00000000..4dac0da4 Binary files /dev/null and b/clock/Library/Artifacts/60/60cd985753cd9c9d86c90c806d8753d6 differ diff --git a/clock/Library/Artifacts/61/611e4a668f5e41728a0e2957a546ac04 b/clock/Library/Artifacts/61/611e4a668f5e41728a0e2957a546ac04 new file mode 100644 index 00000000..c0c909ae Binary files /dev/null and b/clock/Library/Artifacts/61/611e4a668f5e41728a0e2957a546ac04 differ diff --git a/clock/Library/Artifacts/61/619650fd3f762ad2dab19d0cadbb3c7c b/clock/Library/Artifacts/61/619650fd3f762ad2dab19d0cadbb3c7c new file mode 100644 index 00000000..cc145131 Binary files /dev/null and b/clock/Library/Artifacts/61/619650fd3f762ad2dab19d0cadbb3c7c differ diff --git a/clock/Library/Artifacts/61/61a570c42f186a9fa5718e54b4b0ddda b/clock/Library/Artifacts/61/61a570c42f186a9fa5718e54b4b0ddda new file mode 100644 index 00000000..5fc9b0aa Binary files /dev/null and b/clock/Library/Artifacts/61/61a570c42f186a9fa5718e54b4b0ddda differ diff --git a/clock/Library/Artifacts/61/61aacd72177434bbce09138310c8aaf5 b/clock/Library/Artifacts/61/61aacd72177434bbce09138310c8aaf5 new file mode 100644 index 00000000..3476c487 Binary files /dev/null and b/clock/Library/Artifacts/61/61aacd72177434bbce09138310c8aaf5 differ diff --git a/clock/Library/Artifacts/61/61fa4032d17d8fea47e4b4b73fd2e038 b/clock/Library/Artifacts/61/61fa4032d17d8fea47e4b4b73fd2e038 new file mode 100644 index 00000000..105fef49 Binary files /dev/null and b/clock/Library/Artifacts/61/61fa4032d17d8fea47e4b4b73fd2e038 differ diff --git a/clock/Library/Artifacts/62/6220826ea5774d754f0fec3917f000ec b/clock/Library/Artifacts/62/6220826ea5774d754f0fec3917f000ec new file mode 100644 index 00000000..b2c75401 Binary files /dev/null and b/clock/Library/Artifacts/62/6220826ea5774d754f0fec3917f000ec differ diff --git a/clock/Library/Artifacts/62/623f40c740c5b05adb3e3561f637993f b/clock/Library/Artifacts/62/623f40c740c5b05adb3e3561f637993f new file mode 100644 index 00000000..816a8400 Binary files /dev/null and b/clock/Library/Artifacts/62/623f40c740c5b05adb3e3561f637993f differ diff --git a/clock/Library/Artifacts/62/6276d67fa04e426b1be768a027bbdbdb b/clock/Library/Artifacts/62/6276d67fa04e426b1be768a027bbdbdb new file mode 100644 index 00000000..ccd97861 Binary files /dev/null and b/clock/Library/Artifacts/62/6276d67fa04e426b1be768a027bbdbdb differ diff --git a/clock/Library/Artifacts/62/627959dd33080ac7804b15d566fbc780 b/clock/Library/Artifacts/62/627959dd33080ac7804b15d566fbc780 new file mode 100644 index 00000000..b02f42cb Binary files /dev/null and b/clock/Library/Artifacts/62/627959dd33080ac7804b15d566fbc780 differ diff --git a/clock/Library/Artifacts/62/62896476c809352e36990c9c7abe9dd5 b/clock/Library/Artifacts/62/62896476c809352e36990c9c7abe9dd5 new file mode 100644 index 00000000..5b1de5fc Binary files /dev/null and b/clock/Library/Artifacts/62/62896476c809352e36990c9c7abe9dd5 differ diff --git a/clock/Library/Artifacts/62/62b70195903ff78cbded4bd65259b999 b/clock/Library/Artifacts/62/62b70195903ff78cbded4bd65259b999 new file mode 100644 index 00000000..4706a0db Binary files /dev/null and b/clock/Library/Artifacts/62/62b70195903ff78cbded4bd65259b999 differ diff --git a/clock/Library/Artifacts/62/62b90a0cc730a3915ad3cc87267d4f9f b/clock/Library/Artifacts/62/62b90a0cc730a3915ad3cc87267d4f9f new file mode 100644 index 00000000..876dfa0c Binary files /dev/null and b/clock/Library/Artifacts/62/62b90a0cc730a3915ad3cc87267d4f9f differ diff --git a/clock/Library/Artifacts/62/62eea13449554dbc27f88dd6ca684cfe b/clock/Library/Artifacts/62/62eea13449554dbc27f88dd6ca684cfe new file mode 100644 index 00000000..5e49c8c9 Binary files /dev/null and b/clock/Library/Artifacts/62/62eea13449554dbc27f88dd6ca684cfe differ diff --git a/clock/Library/Artifacts/63/633a108c2b17a224a998a41ae8a32275 b/clock/Library/Artifacts/63/633a108c2b17a224a998a41ae8a32275 new file mode 100644 index 00000000..b63cd32f Binary files /dev/null and b/clock/Library/Artifacts/63/633a108c2b17a224a998a41ae8a32275 differ diff --git a/clock/Library/Artifacts/63/6363332690edeaad69b9e7ff0dc19075 b/clock/Library/Artifacts/63/6363332690edeaad69b9e7ff0dc19075 new file mode 100644 index 00000000..3af941bc Binary files /dev/null and b/clock/Library/Artifacts/63/6363332690edeaad69b9e7ff0dc19075 differ diff --git a/clock/Library/Artifacts/63/63a9f506966050501dfbf95060f6cdfc b/clock/Library/Artifacts/63/63a9f506966050501dfbf95060f6cdfc new file mode 100644 index 00000000..e0203770 Binary files /dev/null and b/clock/Library/Artifacts/63/63a9f506966050501dfbf95060f6cdfc differ diff --git a/clock/Library/Artifacts/63/63eac93743b490c75a727f0b1cb9475b b/clock/Library/Artifacts/63/63eac93743b490c75a727f0b1cb9475b new file mode 100644 index 00000000..0e6d0d70 Binary files /dev/null and b/clock/Library/Artifacts/63/63eac93743b490c75a727f0b1cb9475b differ diff --git a/clock/Library/Artifacts/64/6407f9352db1d2f6184732720e46a96d b/clock/Library/Artifacts/64/6407f9352db1d2f6184732720e46a96d new file mode 100644 index 00000000..2fe3710f Binary files /dev/null and b/clock/Library/Artifacts/64/6407f9352db1d2f6184732720e46a96d differ diff --git a/clock/Library/Artifacts/64/6425f65ae48738ce325899687d159e3d b/clock/Library/Artifacts/64/6425f65ae48738ce325899687d159e3d new file mode 100644 index 00000000..49d2817f Binary files /dev/null and b/clock/Library/Artifacts/64/6425f65ae48738ce325899687d159e3d differ diff --git a/clock/Library/Artifacts/64/646050224a5a0c0a5f533e33faf8d646 b/clock/Library/Artifacts/64/646050224a5a0c0a5f533e33faf8d646 new file mode 100644 index 00000000..ea5d6a0f Binary files /dev/null and b/clock/Library/Artifacts/64/646050224a5a0c0a5f533e33faf8d646 differ diff --git a/clock/Library/Artifacts/64/64633bcb44cb297fd82e40ce7f9d8dda b/clock/Library/Artifacts/64/64633bcb44cb297fd82e40ce7f9d8dda new file mode 100644 index 00000000..4c381426 Binary files /dev/null and b/clock/Library/Artifacts/64/64633bcb44cb297fd82e40ce7f9d8dda differ diff --git a/clock/Library/Artifacts/64/6468baaecc107e73cefb6043adc52d50 b/clock/Library/Artifacts/64/6468baaecc107e73cefb6043adc52d50 new file mode 100644 index 00000000..34de83dd Binary files /dev/null and b/clock/Library/Artifacts/64/6468baaecc107e73cefb6043adc52d50 differ diff --git a/clock/Library/Artifacts/64/646fd5c5304bc6e7c2b37508be0ce976 b/clock/Library/Artifacts/64/646fd5c5304bc6e7c2b37508be0ce976 new file mode 100644 index 00000000..b838f26e Binary files /dev/null and b/clock/Library/Artifacts/64/646fd5c5304bc6e7c2b37508be0ce976 differ diff --git a/clock/Library/Artifacts/64/6470e5b271af74adff44c0ac4f81e92b b/clock/Library/Artifacts/64/6470e5b271af74adff44c0ac4f81e92b new file mode 100644 index 00000000..eb1b4ac3 Binary files /dev/null and b/clock/Library/Artifacts/64/6470e5b271af74adff44c0ac4f81e92b differ diff --git a/clock/Library/Artifacts/64/648787267f66e572ed57bfe89d62e33c b/clock/Library/Artifacts/64/648787267f66e572ed57bfe89d62e33c new file mode 100644 index 00000000..fee777d5 Binary files /dev/null and b/clock/Library/Artifacts/64/648787267f66e572ed57bfe89d62e33c differ diff --git a/clock/Library/Artifacts/64/64c9332b4057fef1c3e370ebd3e4563d b/clock/Library/Artifacts/64/64c9332b4057fef1c3e370ebd3e4563d new file mode 100644 index 00000000..841efe0c Binary files /dev/null and b/clock/Library/Artifacts/64/64c9332b4057fef1c3e370ebd3e4563d differ diff --git a/clock/Library/Artifacts/64/64d0632cff21261be599ddc86a785696 b/clock/Library/Artifacts/64/64d0632cff21261be599ddc86a785696 new file mode 100644 index 00000000..659b8dff Binary files /dev/null and b/clock/Library/Artifacts/64/64d0632cff21261be599ddc86a785696 differ diff --git a/clock/Library/Artifacts/64/64ebc5595d0d54b062357351508addc7 b/clock/Library/Artifacts/64/64ebc5595d0d54b062357351508addc7 new file mode 100644 index 00000000..0b5622ce Binary files /dev/null and b/clock/Library/Artifacts/64/64ebc5595d0d54b062357351508addc7 differ diff --git a/clock/Library/Artifacts/65/6547f81a0e3855adfd6922f51a5769f5 b/clock/Library/Artifacts/65/6547f81a0e3855adfd6922f51a5769f5 new file mode 100644 index 00000000..80dbd024 Binary files /dev/null and b/clock/Library/Artifacts/65/6547f81a0e3855adfd6922f51a5769f5 differ diff --git a/clock/Library/Artifacts/65/65c0c8a06acd4441a4fd385e5647c5af b/clock/Library/Artifacts/65/65c0c8a06acd4441a4fd385e5647c5af new file mode 100644 index 00000000..9121bede Binary files /dev/null and b/clock/Library/Artifacts/65/65c0c8a06acd4441a4fd385e5647c5af differ diff --git a/clock/Library/Artifacts/65/65d86183e9e8dd2d76b0dc4bd45fc8ba b/clock/Library/Artifacts/65/65d86183e9e8dd2d76b0dc4bd45fc8ba new file mode 100644 index 00000000..190ee1df Binary files /dev/null and b/clock/Library/Artifacts/65/65d86183e9e8dd2d76b0dc4bd45fc8ba differ diff --git a/clock/Library/Artifacts/65/65e100c7a65aa51dd8fbc20edc4f49e5 b/clock/Library/Artifacts/65/65e100c7a65aa51dd8fbc20edc4f49e5 new file mode 100644 index 00000000..7817321d Binary files /dev/null and b/clock/Library/Artifacts/65/65e100c7a65aa51dd8fbc20edc4f49e5 differ diff --git a/clock/Library/Artifacts/65/65e605a4906157ad3e9dea82f03c1c67 b/clock/Library/Artifacts/65/65e605a4906157ad3e9dea82f03c1c67 new file mode 100644 index 00000000..c6f8527a Binary files /dev/null and b/clock/Library/Artifacts/65/65e605a4906157ad3e9dea82f03c1c67 differ diff --git a/clock/Library/Artifacts/65/65e98b844c62025e1e17acb528099555 b/clock/Library/Artifacts/65/65e98b844c62025e1e17acb528099555 new file mode 100644 index 00000000..74507905 Binary files /dev/null and b/clock/Library/Artifacts/65/65e98b844c62025e1e17acb528099555 differ diff --git a/clock/Library/Artifacts/66/6618a33ea480ac61c334cefe955e7bd9 b/clock/Library/Artifacts/66/6618a33ea480ac61c334cefe955e7bd9 new file mode 100644 index 00000000..67b013a4 Binary files /dev/null and b/clock/Library/Artifacts/66/6618a33ea480ac61c334cefe955e7bd9 differ diff --git a/clock/Library/Artifacts/66/662c12f54f48b75c10062cb8fb603431 b/clock/Library/Artifacts/66/662c12f54f48b75c10062cb8fb603431 new file mode 100644 index 00000000..c8bd634d Binary files /dev/null and b/clock/Library/Artifacts/66/662c12f54f48b75c10062cb8fb603431 differ diff --git a/clock/Library/Artifacts/66/66308f8150b5236267213688e451b5ae b/clock/Library/Artifacts/66/66308f8150b5236267213688e451b5ae new file mode 100644 index 00000000..cf7910bb Binary files /dev/null and b/clock/Library/Artifacts/66/66308f8150b5236267213688e451b5ae differ diff --git a/clock/Library/Artifacts/66/66354c32e750bf76f2dbe2c974a5ac20 b/clock/Library/Artifacts/66/66354c32e750bf76f2dbe2c974a5ac20 new file mode 100644 index 00000000..ff5223ef Binary files /dev/null and b/clock/Library/Artifacts/66/66354c32e750bf76f2dbe2c974a5ac20 differ diff --git a/clock/Library/Artifacts/66/668c7826be7436de1737470c427c4c5c b/clock/Library/Artifacts/66/668c7826be7436de1737470c427c4c5c new file mode 100644 index 00000000..1f2ce8fa Binary files /dev/null and b/clock/Library/Artifacts/66/668c7826be7436de1737470c427c4c5c differ diff --git a/clock/Library/Artifacts/66/668eb1cf87007f7e7abaaae37a2c1a88 b/clock/Library/Artifacts/66/668eb1cf87007f7e7abaaae37a2c1a88 new file mode 100644 index 00000000..8436f0ed Binary files /dev/null and b/clock/Library/Artifacts/66/668eb1cf87007f7e7abaaae37a2c1a88 differ diff --git a/clock/Library/Artifacts/66/66cb8dd935199e9d19a9b48268d89c90 b/clock/Library/Artifacts/66/66cb8dd935199e9d19a9b48268d89c90 new file mode 100644 index 00000000..ac3df35e Binary files /dev/null and b/clock/Library/Artifacts/66/66cb8dd935199e9d19a9b48268d89c90 differ diff --git a/clock/Library/Artifacts/66/66dc943b859dc6bcb78b1d3047c8522c b/clock/Library/Artifacts/66/66dc943b859dc6bcb78b1d3047c8522c new file mode 100644 index 00000000..62f6143d Binary files /dev/null and b/clock/Library/Artifacts/66/66dc943b859dc6bcb78b1d3047c8522c differ diff --git a/clock/Library/Artifacts/66/66f5928ad36627139e1c423123a049b1 b/clock/Library/Artifacts/66/66f5928ad36627139e1c423123a049b1 new file mode 100644 index 00000000..7d1d8e02 Binary files /dev/null and b/clock/Library/Artifacts/66/66f5928ad36627139e1c423123a049b1 differ diff --git a/clock/Library/Artifacts/67/6700d8eb1538b6d927d39a49652f6b26 b/clock/Library/Artifacts/67/6700d8eb1538b6d927d39a49652f6b26 new file mode 100644 index 00000000..5ceeb83e Binary files /dev/null and b/clock/Library/Artifacts/67/6700d8eb1538b6d927d39a49652f6b26 differ diff --git a/clock/Library/Artifacts/67/672e9420477724adcc5d9d0536b6b327 b/clock/Library/Artifacts/67/672e9420477724adcc5d9d0536b6b327 new file mode 100644 index 00000000..316bf8ab Binary files /dev/null and b/clock/Library/Artifacts/67/672e9420477724adcc5d9d0536b6b327 differ diff --git a/clock/Library/Artifacts/67/6732ef35fdb392ed86ac927843971d4d b/clock/Library/Artifacts/67/6732ef35fdb392ed86ac927843971d4d new file mode 100644 index 00000000..e4142087 Binary files /dev/null and b/clock/Library/Artifacts/67/6732ef35fdb392ed86ac927843971d4d differ diff --git a/clock/Library/Artifacts/67/6776860377af6eacbe1b9180f5a9c8f9 b/clock/Library/Artifacts/67/6776860377af6eacbe1b9180f5a9c8f9 new file mode 100644 index 00000000..50b77682 Binary files /dev/null and b/clock/Library/Artifacts/67/6776860377af6eacbe1b9180f5a9c8f9 differ diff --git a/clock/Library/Artifacts/67/6787b149d251226e52880d9e478740ae b/clock/Library/Artifacts/67/6787b149d251226e52880d9e478740ae new file mode 100644 index 00000000..63fde1bb Binary files /dev/null and b/clock/Library/Artifacts/67/6787b149d251226e52880d9e478740ae differ diff --git a/clock/Library/Artifacts/67/678fe98469ebe2f6ee0948e932ad48fe b/clock/Library/Artifacts/67/678fe98469ebe2f6ee0948e932ad48fe new file mode 100644 index 00000000..cb8f6878 Binary files /dev/null and b/clock/Library/Artifacts/67/678fe98469ebe2f6ee0948e932ad48fe differ diff --git a/clock/Library/Artifacts/67/679bf5683bab61b467dc89fa49169d87 b/clock/Library/Artifacts/67/679bf5683bab61b467dc89fa49169d87 new file mode 100644 index 00000000..417585a1 Binary files /dev/null and b/clock/Library/Artifacts/67/679bf5683bab61b467dc89fa49169d87 differ diff --git a/clock/Library/Artifacts/67/67e4dd2f343895383fd11e502fa14e31 b/clock/Library/Artifacts/67/67e4dd2f343895383fd11e502fa14e31 new file mode 100644 index 00000000..7e5ff547 Binary files /dev/null and b/clock/Library/Artifacts/67/67e4dd2f343895383fd11e502fa14e31 differ diff --git a/clock/Library/Artifacts/67/67e63d7095539bdbe72e6b50dc6a3117 b/clock/Library/Artifacts/67/67e63d7095539bdbe72e6b50dc6a3117 new file mode 100644 index 00000000..5c5f8745 Binary files /dev/null and b/clock/Library/Artifacts/67/67e63d7095539bdbe72e6b50dc6a3117 differ diff --git a/clock/Library/Artifacts/67/67f723c92a80a8b1f748e9d3c440f116 b/clock/Library/Artifacts/67/67f723c92a80a8b1f748e9d3c440f116 new file mode 100644 index 00000000..e5c04c67 Binary files /dev/null and b/clock/Library/Artifacts/67/67f723c92a80a8b1f748e9d3c440f116 differ diff --git a/clock/Library/Artifacts/67/67faf668c02d0510504b2b40f8453cc5 b/clock/Library/Artifacts/67/67faf668c02d0510504b2b40f8453cc5 new file mode 100644 index 00000000..f0855248 Binary files /dev/null and b/clock/Library/Artifacts/67/67faf668c02d0510504b2b40f8453cc5 differ diff --git a/clock/Library/Artifacts/67/67ff18fabb6940efbdbda718963c93f4 b/clock/Library/Artifacts/67/67ff18fabb6940efbdbda718963c93f4 new file mode 100644 index 00000000..97ef888f Binary files /dev/null and b/clock/Library/Artifacts/67/67ff18fabb6940efbdbda718963c93f4 differ diff --git a/clock/Library/Artifacts/68/688a50e729482f5c8320bc625fe58000 b/clock/Library/Artifacts/68/688a50e729482f5c8320bc625fe58000 new file mode 100644 index 00000000..0faa4999 Binary files /dev/null and b/clock/Library/Artifacts/68/688a50e729482f5c8320bc625fe58000 differ diff --git a/clock/Library/Artifacts/68/689e18a9411d5d0a41ed8f244ebaf778 b/clock/Library/Artifacts/68/689e18a9411d5d0a41ed8f244ebaf778 new file mode 100644 index 00000000..964130d6 Binary files /dev/null and b/clock/Library/Artifacts/68/689e18a9411d5d0a41ed8f244ebaf778 differ diff --git a/clock/Library/Artifacts/68/68ac9e3081dd425f7b8f0ac9e1732902 b/clock/Library/Artifacts/68/68ac9e3081dd425f7b8f0ac9e1732902 new file mode 100644 index 00000000..04e2818e Binary files /dev/null and b/clock/Library/Artifacts/68/68ac9e3081dd425f7b8f0ac9e1732902 differ diff --git a/clock/Library/Artifacts/68/68eba0c6eb22037d6486d66cf70fa653 b/clock/Library/Artifacts/68/68eba0c6eb22037d6486d66cf70fa653 new file mode 100644 index 00000000..f352b281 Binary files /dev/null and b/clock/Library/Artifacts/68/68eba0c6eb22037d6486d66cf70fa653 differ diff --git a/clock/Library/Artifacts/69/6917b8c8a47f7e1cb6023a6a0b263798 b/clock/Library/Artifacts/69/6917b8c8a47f7e1cb6023a6a0b263798 new file mode 100644 index 00000000..dcafabb0 Binary files /dev/null and b/clock/Library/Artifacts/69/6917b8c8a47f7e1cb6023a6a0b263798 differ diff --git a/clock/Library/Artifacts/69/6935fb18091ac08209bd0d15bd55692a b/clock/Library/Artifacts/69/6935fb18091ac08209bd0d15bd55692a new file mode 100644 index 00000000..60eb7173 Binary files /dev/null and b/clock/Library/Artifacts/69/6935fb18091ac08209bd0d15bd55692a differ diff --git a/clock/Library/Artifacts/69/6941f020496f6b94437bd565685dec2f b/clock/Library/Artifacts/69/6941f020496f6b94437bd565685dec2f new file mode 100644 index 00000000..fa203701 Binary files /dev/null and b/clock/Library/Artifacts/69/6941f020496f6b94437bd565685dec2f differ diff --git a/clock/Library/Artifacts/69/69839c2f97d29175348474ae0e11670e b/clock/Library/Artifacts/69/69839c2f97d29175348474ae0e11670e new file mode 100644 index 00000000..2792147a Binary files /dev/null and b/clock/Library/Artifacts/69/69839c2f97d29175348474ae0e11670e differ diff --git a/clock/Library/Artifacts/69/699055fa6206fbc3280d9b44aa1ea088 b/clock/Library/Artifacts/69/699055fa6206fbc3280d9b44aa1ea088 new file mode 100644 index 00000000..436a49a9 Binary files /dev/null and b/clock/Library/Artifacts/69/699055fa6206fbc3280d9b44aa1ea088 differ diff --git a/clock/Library/Artifacts/69/69aeb2a67f92e60708a16613aebfd430 b/clock/Library/Artifacts/69/69aeb2a67f92e60708a16613aebfd430 new file mode 100644 index 00000000..864d58e7 Binary files /dev/null and b/clock/Library/Artifacts/69/69aeb2a67f92e60708a16613aebfd430 differ diff --git a/clock/Library/Artifacts/6a/6a43f37acb533d22948f44bd88e357cc b/clock/Library/Artifacts/6a/6a43f37acb533d22948f44bd88e357cc new file mode 100644 index 00000000..b1089b9a Binary files /dev/null and b/clock/Library/Artifacts/6a/6a43f37acb533d22948f44bd88e357cc differ diff --git a/clock/Library/Artifacts/6a/6a5147a1fd1cea56e8858cd484074c5e b/clock/Library/Artifacts/6a/6a5147a1fd1cea56e8858cd484074c5e new file mode 100644 index 00000000..5df6ea52 Binary files /dev/null and b/clock/Library/Artifacts/6a/6a5147a1fd1cea56e8858cd484074c5e differ diff --git a/clock/Library/Artifacts/6a/6a907375d55461b5b042f0eca2505f6d b/clock/Library/Artifacts/6a/6a907375d55461b5b042f0eca2505f6d new file mode 100644 index 00000000..dc09c93b Binary files /dev/null and b/clock/Library/Artifacts/6a/6a907375d55461b5b042f0eca2505f6d differ diff --git a/clock/Library/Artifacts/6a/6a98254857369f82257467e4c97c7677 b/clock/Library/Artifacts/6a/6a98254857369f82257467e4c97c7677 new file mode 100644 index 00000000..f552458b Binary files /dev/null and b/clock/Library/Artifacts/6a/6a98254857369f82257467e4c97c7677 differ diff --git a/clock/Library/Artifacts/6a/6aaf1368869aecc3227dc31154642269 b/clock/Library/Artifacts/6a/6aaf1368869aecc3227dc31154642269 new file mode 100644 index 00000000..b4467d05 Binary files /dev/null and b/clock/Library/Artifacts/6a/6aaf1368869aecc3227dc31154642269 differ diff --git a/clock/Library/Artifacts/6a/6ac72a75dbcf1fbc13508f1c6638e7b4 b/clock/Library/Artifacts/6a/6ac72a75dbcf1fbc13508f1c6638e7b4 new file mode 100644 index 00000000..6509ea78 Binary files /dev/null and b/clock/Library/Artifacts/6a/6ac72a75dbcf1fbc13508f1c6638e7b4 differ diff --git a/clock/Library/Artifacts/6a/6ad234b2bc56f93ecad7a5f51fdad6fd b/clock/Library/Artifacts/6a/6ad234b2bc56f93ecad7a5f51fdad6fd new file mode 100644 index 00000000..3eb71f82 Binary files /dev/null and b/clock/Library/Artifacts/6a/6ad234b2bc56f93ecad7a5f51fdad6fd differ diff --git a/clock/Library/Artifacts/6a/6adaa7914fccbf73cbed059ebdec7eea b/clock/Library/Artifacts/6a/6adaa7914fccbf73cbed059ebdec7eea new file mode 100644 index 00000000..6c19e3de Binary files /dev/null and b/clock/Library/Artifacts/6a/6adaa7914fccbf73cbed059ebdec7eea differ diff --git a/clock/Library/Artifacts/6b/6b27776496d52feb65ced5624652c65b b/clock/Library/Artifacts/6b/6b27776496d52feb65ced5624652c65b new file mode 100644 index 00000000..3ee93b64 Binary files /dev/null and b/clock/Library/Artifacts/6b/6b27776496d52feb65ced5624652c65b differ diff --git a/clock/Library/Artifacts/6b/6be9dc54110a31143d3a43691488c26b b/clock/Library/Artifacts/6b/6be9dc54110a31143d3a43691488c26b new file mode 100644 index 00000000..64dec8d0 Binary files /dev/null and b/clock/Library/Artifacts/6b/6be9dc54110a31143d3a43691488c26b differ diff --git a/clock/Library/Artifacts/6b/6bf38563b79298cda441a91bdb5e0e5e b/clock/Library/Artifacts/6b/6bf38563b79298cda441a91bdb5e0e5e new file mode 100644 index 00000000..a75bfd74 Binary files /dev/null and b/clock/Library/Artifacts/6b/6bf38563b79298cda441a91bdb5e0e5e differ diff --git a/clock/Library/Artifacts/6b/6bfdc85be78478b12571c47c1fa4d3aa b/clock/Library/Artifacts/6b/6bfdc85be78478b12571c47c1fa4d3aa new file mode 100644 index 00000000..83c6e80a Binary files /dev/null and b/clock/Library/Artifacts/6b/6bfdc85be78478b12571c47c1fa4d3aa differ diff --git a/clock/Library/Artifacts/6c/6c13f748a804ed4129501586fc84dae6 b/clock/Library/Artifacts/6c/6c13f748a804ed4129501586fc84dae6 new file mode 100644 index 00000000..4560b824 Binary files /dev/null and b/clock/Library/Artifacts/6c/6c13f748a804ed4129501586fc84dae6 differ diff --git a/clock/Library/Artifacts/6c/6c2ba0d183d4519b09f715e6e746221a b/clock/Library/Artifacts/6c/6c2ba0d183d4519b09f715e6e746221a new file mode 100644 index 00000000..218457ec Binary files /dev/null and b/clock/Library/Artifacts/6c/6c2ba0d183d4519b09f715e6e746221a differ diff --git a/clock/Library/Artifacts/6c/6c33be4434dba6e2ef66e9e352d20647 b/clock/Library/Artifacts/6c/6c33be4434dba6e2ef66e9e352d20647 new file mode 100644 index 00000000..28d301a2 Binary files /dev/null and b/clock/Library/Artifacts/6c/6c33be4434dba6e2ef66e9e352d20647 differ diff --git a/clock/Library/Artifacts/6c/6c61919ca1de25c69795afdc5fa37843 b/clock/Library/Artifacts/6c/6c61919ca1de25c69795afdc5fa37843 new file mode 100644 index 00000000..2f5a63dc Binary files /dev/null and b/clock/Library/Artifacts/6c/6c61919ca1de25c69795afdc5fa37843 differ diff --git a/clock/Library/Artifacts/6c/6c68999f70f27ff7c436d7d5ebec0443 b/clock/Library/Artifacts/6c/6c68999f70f27ff7c436d7d5ebec0443 new file mode 100644 index 00000000..b810d618 Binary files /dev/null and b/clock/Library/Artifacts/6c/6c68999f70f27ff7c436d7d5ebec0443 differ diff --git a/clock/Library/Artifacts/6c/6c89c0903def4275f083b5cb2a8cfda8 b/clock/Library/Artifacts/6c/6c89c0903def4275f083b5cb2a8cfda8 new file mode 100644 index 00000000..ea0081c5 Binary files /dev/null and b/clock/Library/Artifacts/6c/6c89c0903def4275f083b5cb2a8cfda8 differ diff --git a/clock/Library/Artifacts/6c/6c924df507920c74f1f6b75280298ea9 b/clock/Library/Artifacts/6c/6c924df507920c74f1f6b75280298ea9 new file mode 100644 index 00000000..89520076 Binary files /dev/null and b/clock/Library/Artifacts/6c/6c924df507920c74f1f6b75280298ea9 differ diff --git a/clock/Library/Artifacts/6c/6cf9b68aa8ad3324ff114591df23787e b/clock/Library/Artifacts/6c/6cf9b68aa8ad3324ff114591df23787e new file mode 100644 index 00000000..233a5549 Binary files /dev/null and b/clock/Library/Artifacts/6c/6cf9b68aa8ad3324ff114591df23787e differ diff --git a/clock/Library/Artifacts/6d/6d05d2d20b2c47bb05d559b8f7159701 b/clock/Library/Artifacts/6d/6d05d2d20b2c47bb05d559b8f7159701 new file mode 100644 index 00000000..3f00c1f5 Binary files /dev/null and b/clock/Library/Artifacts/6d/6d05d2d20b2c47bb05d559b8f7159701 differ diff --git a/clock/Library/Artifacts/6d/6daedf3554b7b19329f47d68c8c3b6b7 b/clock/Library/Artifacts/6d/6daedf3554b7b19329f47d68c8c3b6b7 new file mode 100644 index 00000000..273de8df Binary files /dev/null and b/clock/Library/Artifacts/6d/6daedf3554b7b19329f47d68c8c3b6b7 differ diff --git a/clock/Library/Artifacts/6e/6e0f47707af983e9b8ec255724f8f81e b/clock/Library/Artifacts/6e/6e0f47707af983e9b8ec255724f8f81e new file mode 100644 index 00000000..ea47d87b Binary files /dev/null and b/clock/Library/Artifacts/6e/6e0f47707af983e9b8ec255724f8f81e differ diff --git a/clock/Library/Artifacts/6e/6e20f6756de9ecf020809539789e9190 b/clock/Library/Artifacts/6e/6e20f6756de9ecf020809539789e9190 new file mode 100644 index 00000000..ec3f333d Binary files /dev/null and b/clock/Library/Artifacts/6e/6e20f6756de9ecf020809539789e9190 differ diff --git a/clock/Library/Artifacts/6e/6e670ff91c34f90da951806a3372d225 b/clock/Library/Artifacts/6e/6e670ff91c34f90da951806a3372d225 new file mode 100644 index 00000000..81d616b3 Binary files /dev/null and b/clock/Library/Artifacts/6e/6e670ff91c34f90da951806a3372d225 differ diff --git a/clock/Library/Artifacts/6e/6ebd1f73492fdf6ca46111dee2d6165c b/clock/Library/Artifacts/6e/6ebd1f73492fdf6ca46111dee2d6165c new file mode 100644 index 00000000..0ddb8927 Binary files /dev/null and b/clock/Library/Artifacts/6e/6ebd1f73492fdf6ca46111dee2d6165c differ diff --git a/clock/Library/Artifacts/6e/6ece5606c0d91afb9cc6971d7156353c b/clock/Library/Artifacts/6e/6ece5606c0d91afb9cc6971d7156353c new file mode 100644 index 00000000..41fe660c Binary files /dev/null and b/clock/Library/Artifacts/6e/6ece5606c0d91afb9cc6971d7156353c differ diff --git a/clock/Library/Artifacts/6e/6ed89a84906bc4b6fcf8b33dc3c19598 b/clock/Library/Artifacts/6e/6ed89a84906bc4b6fcf8b33dc3c19598 new file mode 100644 index 00000000..b25e1f39 Binary files /dev/null and b/clock/Library/Artifacts/6e/6ed89a84906bc4b6fcf8b33dc3c19598 differ diff --git a/clock/Library/Artifacts/6e/6ed89d6a1dc9713f873e994213522004 b/clock/Library/Artifacts/6e/6ed89d6a1dc9713f873e994213522004 new file mode 100644 index 00000000..cbaaee77 Binary files /dev/null and b/clock/Library/Artifacts/6e/6ed89d6a1dc9713f873e994213522004 differ diff --git a/clock/Library/Artifacts/6f/6f5812a832955954081183546ed3286a b/clock/Library/Artifacts/6f/6f5812a832955954081183546ed3286a new file mode 100644 index 00000000..a5bff4bd Binary files /dev/null and b/clock/Library/Artifacts/6f/6f5812a832955954081183546ed3286a differ diff --git a/clock/Library/Artifacts/6f/6f69f7cabd6e4abec40cd458376ccfcc b/clock/Library/Artifacts/6f/6f69f7cabd6e4abec40cd458376ccfcc new file mode 100644 index 00000000..50a638e0 Binary files /dev/null and b/clock/Library/Artifacts/6f/6f69f7cabd6e4abec40cd458376ccfcc differ diff --git a/clock/Library/Artifacts/6f/6fa7e45f4fea48d8973e500949498a6b b/clock/Library/Artifacts/6f/6fa7e45f4fea48d8973e500949498a6b new file mode 100644 index 00000000..d104a4a2 Binary files /dev/null and b/clock/Library/Artifacts/6f/6fa7e45f4fea48d8973e500949498a6b differ diff --git a/clock/Library/Artifacts/6f/6faaf401de9d925a06deb01031203d44 b/clock/Library/Artifacts/6f/6faaf401de9d925a06deb01031203d44 new file mode 100644 index 00000000..b20da55f Binary files /dev/null and b/clock/Library/Artifacts/6f/6faaf401de9d925a06deb01031203d44 differ diff --git a/clock/Library/Artifacts/70/70690c611dee5cb02a12a79b2986b290 b/clock/Library/Artifacts/70/70690c611dee5cb02a12a79b2986b290 new file mode 100644 index 00000000..e496b8b3 Binary files /dev/null and b/clock/Library/Artifacts/70/70690c611dee5cb02a12a79b2986b290 differ diff --git a/clock/Library/Artifacts/70/70a72c9308f9e4da72713c69c7739562 b/clock/Library/Artifacts/70/70a72c9308f9e4da72713c69c7739562 new file mode 100644 index 00000000..75b7e4d0 Binary files /dev/null and b/clock/Library/Artifacts/70/70a72c9308f9e4da72713c69c7739562 differ diff --git a/clock/Library/Artifacts/70/70affe89880455925ed49877ca0071a4 b/clock/Library/Artifacts/70/70affe89880455925ed49877ca0071a4 new file mode 100644 index 00000000..68dbdfb4 Binary files /dev/null and b/clock/Library/Artifacts/70/70affe89880455925ed49877ca0071a4 differ diff --git a/clock/Library/Artifacts/70/70b842b91ab6d0bcfb84a221fb71f25f b/clock/Library/Artifacts/70/70b842b91ab6d0bcfb84a221fb71f25f new file mode 100644 index 00000000..015995d3 Binary files /dev/null and b/clock/Library/Artifacts/70/70b842b91ab6d0bcfb84a221fb71f25f differ diff --git a/clock/Library/Artifacts/70/70db403a8eb729e7062f273c70a0cb56 b/clock/Library/Artifacts/70/70db403a8eb729e7062f273c70a0cb56 new file mode 100644 index 00000000..ab51b0c6 Binary files /dev/null and b/clock/Library/Artifacts/70/70db403a8eb729e7062f273c70a0cb56 differ diff --git a/clock/Library/Artifacts/71/7108920c47fbefa2ba146d6a559ec41e b/clock/Library/Artifacts/71/7108920c47fbefa2ba146d6a559ec41e new file mode 100644 index 00000000..c02d4477 Binary files /dev/null and b/clock/Library/Artifacts/71/7108920c47fbefa2ba146d6a559ec41e differ diff --git a/clock/Library/Artifacts/71/7136abb7cd30e1b9f67bd55728b588fa b/clock/Library/Artifacts/71/7136abb7cd30e1b9f67bd55728b588fa new file mode 100644 index 00000000..3f2e35ef Binary files /dev/null and b/clock/Library/Artifacts/71/7136abb7cd30e1b9f67bd55728b588fa differ diff --git a/clock/Library/Artifacts/71/7181d769a0da6ca74c62767fd7bc1a92 b/clock/Library/Artifacts/71/7181d769a0da6ca74c62767fd7bc1a92 new file mode 100644 index 00000000..c145d03e Binary files /dev/null and b/clock/Library/Artifacts/71/7181d769a0da6ca74c62767fd7bc1a92 differ diff --git a/clock/Library/Artifacts/71/7192838da940edbbf45509b4059c1061 b/clock/Library/Artifacts/71/7192838da940edbbf45509b4059c1061 new file mode 100644 index 00000000..22284740 Binary files /dev/null and b/clock/Library/Artifacts/71/7192838da940edbbf45509b4059c1061 differ diff --git a/clock/Library/Artifacts/71/71b1cf657d94ff8b63b342602256db33 b/clock/Library/Artifacts/71/71b1cf657d94ff8b63b342602256db33 new file mode 100644 index 00000000..33837750 Binary files /dev/null and b/clock/Library/Artifacts/71/71b1cf657d94ff8b63b342602256db33 differ diff --git a/clock/Library/Artifacts/71/71e851f64f3270db04b6d9cf2e4ddead b/clock/Library/Artifacts/71/71e851f64f3270db04b6d9cf2e4ddead new file mode 100644 index 00000000..3fe2df84 Binary files /dev/null and b/clock/Library/Artifacts/71/71e851f64f3270db04b6d9cf2e4ddead differ diff --git a/clock/Library/Artifacts/72/722dd7bc653ee1273059d3427de53513 b/clock/Library/Artifacts/72/722dd7bc653ee1273059d3427de53513 new file mode 100644 index 00000000..7dab6189 Binary files /dev/null and b/clock/Library/Artifacts/72/722dd7bc653ee1273059d3427de53513 differ diff --git a/clock/Library/Artifacts/72/724697400fd9c9558b0f5672c9a2e2e8 b/clock/Library/Artifacts/72/724697400fd9c9558b0f5672c9a2e2e8 new file mode 100644 index 00000000..be34ffa3 Binary files /dev/null and b/clock/Library/Artifacts/72/724697400fd9c9558b0f5672c9a2e2e8 differ diff --git a/clock/Library/Artifacts/72/727019887099d1c6a6965221f4309a4d b/clock/Library/Artifacts/72/727019887099d1c6a6965221f4309a4d new file mode 100644 index 00000000..867f1ffb Binary files /dev/null and b/clock/Library/Artifacts/72/727019887099d1c6a6965221f4309a4d differ diff --git a/clock/Library/Artifacts/72/72772c84b54cb493c821d0b7cc2b26ab b/clock/Library/Artifacts/72/72772c84b54cb493c821d0b7cc2b26ab new file mode 100644 index 00000000..edbd6a4a Binary files /dev/null and b/clock/Library/Artifacts/72/72772c84b54cb493c821d0b7cc2b26ab differ diff --git a/clock/Library/Artifacts/72/72b2de892075550843740653e013537c b/clock/Library/Artifacts/72/72b2de892075550843740653e013537c new file mode 100644 index 00000000..e39b474f Binary files /dev/null and b/clock/Library/Artifacts/72/72b2de892075550843740653e013537c differ diff --git a/clock/Library/Artifacts/73/73108bddc39b44b21bec93e5b0fb1390 b/clock/Library/Artifacts/73/73108bddc39b44b21bec93e5b0fb1390 new file mode 100644 index 00000000..c0a8f02b Binary files /dev/null and b/clock/Library/Artifacts/73/73108bddc39b44b21bec93e5b0fb1390 differ diff --git a/clock/Library/Artifacts/73/73b30698761cc876468f0957fc2dcdb1 b/clock/Library/Artifacts/73/73b30698761cc876468f0957fc2dcdb1 new file mode 100644 index 00000000..d3372b7d Binary files /dev/null and b/clock/Library/Artifacts/73/73b30698761cc876468f0957fc2dcdb1 differ diff --git a/clock/Library/Artifacts/73/73d6a34541bf0be7d477ec68db129ef2 b/clock/Library/Artifacts/73/73d6a34541bf0be7d477ec68db129ef2 new file mode 100644 index 00000000..2c25d27e Binary files /dev/null and b/clock/Library/Artifacts/73/73d6a34541bf0be7d477ec68db129ef2 differ diff --git a/clock/Library/Artifacts/73/73fa2d19a4ab5f5ac0be7d8a32a77365 b/clock/Library/Artifacts/73/73fa2d19a4ab5f5ac0be7d8a32a77365 new file mode 100644 index 00000000..f4e50a30 Binary files /dev/null and b/clock/Library/Artifacts/73/73fa2d19a4ab5f5ac0be7d8a32a77365 differ diff --git a/clock/Library/Artifacts/74/742cbb989ba59f929cf4c1723056f9df b/clock/Library/Artifacts/74/742cbb989ba59f929cf4c1723056f9df new file mode 100644 index 00000000..cda9935a Binary files /dev/null and b/clock/Library/Artifacts/74/742cbb989ba59f929cf4c1723056f9df differ diff --git a/clock/Library/Artifacts/74/748d9a5d20a98213a343c972aa47c462 b/clock/Library/Artifacts/74/748d9a5d20a98213a343c972aa47c462 new file mode 100644 index 00000000..fcfdcf73 Binary files /dev/null and b/clock/Library/Artifacts/74/748d9a5d20a98213a343c972aa47c462 differ diff --git a/clock/Library/Artifacts/74/7494dd4ae78f8b92d3fa609c5e4e3cbd b/clock/Library/Artifacts/74/7494dd4ae78f8b92d3fa609c5e4e3cbd new file mode 100644 index 00000000..e12f1dee Binary files /dev/null and b/clock/Library/Artifacts/74/7494dd4ae78f8b92d3fa609c5e4e3cbd differ diff --git a/clock/Library/Artifacts/74/74b84aeb0abb92f8128e2858db348eb5 b/clock/Library/Artifacts/74/74b84aeb0abb92f8128e2858db348eb5 new file mode 100644 index 00000000..d5836042 Binary files /dev/null and b/clock/Library/Artifacts/74/74b84aeb0abb92f8128e2858db348eb5 differ diff --git a/clock/Library/Artifacts/74/74d9c21a638a34c98e9a633c8e2d47e9 b/clock/Library/Artifacts/74/74d9c21a638a34c98e9a633c8e2d47e9 new file mode 100644 index 00000000..d79dee2e Binary files /dev/null and b/clock/Library/Artifacts/74/74d9c21a638a34c98e9a633c8e2d47e9 differ diff --git a/clock/Library/Artifacts/74/74e8ae365aed8b147044d072c55b2099 b/clock/Library/Artifacts/74/74e8ae365aed8b147044d072c55b2099 new file mode 100644 index 00000000..a171986c Binary files /dev/null and b/clock/Library/Artifacts/74/74e8ae365aed8b147044d072c55b2099 differ diff --git a/clock/Library/Artifacts/75/752555272790a054ec380b6570c279c2 b/clock/Library/Artifacts/75/752555272790a054ec380b6570c279c2 new file mode 100644 index 00000000..2801ca4a Binary files /dev/null and b/clock/Library/Artifacts/75/752555272790a054ec380b6570c279c2 differ diff --git a/clock/Library/Artifacts/75/756397c01ce4694f4073c838029cd9b4 b/clock/Library/Artifacts/75/756397c01ce4694f4073c838029cd9b4 new file mode 100644 index 00000000..b951db66 Binary files /dev/null and b/clock/Library/Artifacts/75/756397c01ce4694f4073c838029cd9b4 differ diff --git a/clock/Library/Artifacts/75/757bfa2c443582e19e5ffada62e77d75 b/clock/Library/Artifacts/75/757bfa2c443582e19e5ffada62e77d75 new file mode 100644 index 00000000..c085cdff Binary files /dev/null and b/clock/Library/Artifacts/75/757bfa2c443582e19e5ffada62e77d75 differ diff --git a/clock/Library/Artifacts/75/759fa782a1a19355fc7154f167b8e057 b/clock/Library/Artifacts/75/759fa782a1a19355fc7154f167b8e057 new file mode 100644 index 00000000..24b31583 Binary files /dev/null and b/clock/Library/Artifacts/75/759fa782a1a19355fc7154f167b8e057 differ diff --git a/clock/Library/Artifacts/75/75cbde4f8e050f7361169f06d4e36209 b/clock/Library/Artifacts/75/75cbde4f8e050f7361169f06d4e36209 new file mode 100644 index 00000000..cafff060 Binary files /dev/null and b/clock/Library/Artifacts/75/75cbde4f8e050f7361169f06d4e36209 differ diff --git a/clock/Library/Artifacts/76/76430bbe2e87dea9fe177a06461efb57 b/clock/Library/Artifacts/76/76430bbe2e87dea9fe177a06461efb57 new file mode 100644 index 00000000..3d31682e Binary files /dev/null and b/clock/Library/Artifacts/76/76430bbe2e87dea9fe177a06461efb57 differ diff --git a/clock/Library/Artifacts/76/76711dac0005e696c78fed08e16c33b4 b/clock/Library/Artifacts/76/76711dac0005e696c78fed08e16c33b4 new file mode 100644 index 00000000..8192fe01 Binary files /dev/null and b/clock/Library/Artifacts/76/76711dac0005e696c78fed08e16c33b4 differ diff --git a/clock/Library/Artifacts/76/76a87f6ec616e416e2bf758d9553168e b/clock/Library/Artifacts/76/76a87f6ec616e416e2bf758d9553168e new file mode 100644 index 00000000..ccc7165b Binary files /dev/null and b/clock/Library/Artifacts/76/76a87f6ec616e416e2bf758d9553168e differ diff --git a/clock/Library/Artifacts/76/76a969e8d33daa5ee42b1136dee0110f b/clock/Library/Artifacts/76/76a969e8d33daa5ee42b1136dee0110f new file mode 100644 index 00000000..12710af9 Binary files /dev/null and b/clock/Library/Artifacts/76/76a969e8d33daa5ee42b1136dee0110f differ diff --git a/clock/Library/Artifacts/76/76b2f1c6cb6983a27de1393c0c4cb94e b/clock/Library/Artifacts/76/76b2f1c6cb6983a27de1393c0c4cb94e new file mode 100644 index 00000000..69bec97d Binary files /dev/null and b/clock/Library/Artifacts/76/76b2f1c6cb6983a27de1393c0c4cb94e differ diff --git a/clock/Library/Artifacts/76/76be6cf307ff821c647bf6e7b2847774 b/clock/Library/Artifacts/76/76be6cf307ff821c647bf6e7b2847774 new file mode 100644 index 00000000..5d9a186f Binary files /dev/null and b/clock/Library/Artifacts/76/76be6cf307ff821c647bf6e7b2847774 differ diff --git a/clock/Library/Artifacts/76/76d49e12590685f0633a2ae1c74b0f52 b/clock/Library/Artifacts/76/76d49e12590685f0633a2ae1c74b0f52 new file mode 100644 index 00000000..46f17962 Binary files /dev/null and b/clock/Library/Artifacts/76/76d49e12590685f0633a2ae1c74b0f52 differ diff --git a/clock/Library/Artifacts/76/76ef304cbe21f35d7bd9c3a3f060cd56 b/clock/Library/Artifacts/76/76ef304cbe21f35d7bd9c3a3f060cd56 new file mode 100644 index 00000000..66008b16 Binary files /dev/null and b/clock/Library/Artifacts/76/76ef304cbe21f35d7bd9c3a3f060cd56 differ diff --git a/clock/Library/Artifacts/76/76fc9ab24b28a0cb7b6c423f84a6a83e b/clock/Library/Artifacts/76/76fc9ab24b28a0cb7b6c423f84a6a83e new file mode 100644 index 00000000..52944257 Binary files /dev/null and b/clock/Library/Artifacts/76/76fc9ab24b28a0cb7b6c423f84a6a83e differ diff --git a/clock/Library/Artifacts/76/76ffed4f8e671af194ca2c8200afa159 b/clock/Library/Artifacts/76/76ffed4f8e671af194ca2c8200afa159 new file mode 100644 index 00000000..e341bddc Binary files /dev/null and b/clock/Library/Artifacts/76/76ffed4f8e671af194ca2c8200afa159 differ diff --git a/clock/Library/Artifacts/77/777aedec704bafe35e4490c6bd0672d1 b/clock/Library/Artifacts/77/777aedec704bafe35e4490c6bd0672d1 new file mode 100644 index 00000000..ff41f795 Binary files /dev/null and b/clock/Library/Artifacts/77/777aedec704bafe35e4490c6bd0672d1 differ diff --git a/clock/Library/Artifacts/77/778d1f773f75e0efa5180d8a2b1056d9 b/clock/Library/Artifacts/77/778d1f773f75e0efa5180d8a2b1056d9 new file mode 100644 index 00000000..975122e3 Binary files /dev/null and b/clock/Library/Artifacts/77/778d1f773f75e0efa5180d8a2b1056d9 differ diff --git a/clock/Library/Artifacts/78/7808c154cf09768b6b1b29474f47efc7 b/clock/Library/Artifacts/78/7808c154cf09768b6b1b29474f47efc7 new file mode 100644 index 00000000..9c532f87 Binary files /dev/null and b/clock/Library/Artifacts/78/7808c154cf09768b6b1b29474f47efc7 differ diff --git a/clock/Library/Artifacts/78/785c98f6737f1405c792e7db9dadf269 b/clock/Library/Artifacts/78/785c98f6737f1405c792e7db9dadf269 new file mode 100644 index 00000000..356c85b8 Binary files /dev/null and b/clock/Library/Artifacts/78/785c98f6737f1405c792e7db9dadf269 differ diff --git a/clock/Library/Artifacts/78/7862350a9b0899b0197fd93ddc079999 b/clock/Library/Artifacts/78/7862350a9b0899b0197fd93ddc079999 new file mode 100644 index 00000000..9b262947 Binary files /dev/null and b/clock/Library/Artifacts/78/7862350a9b0899b0197fd93ddc079999 differ diff --git a/clock/Library/Artifacts/78/788c2e328fca6991733e67798b16214a b/clock/Library/Artifacts/78/788c2e328fca6991733e67798b16214a new file mode 100644 index 00000000..073df6ea Binary files /dev/null and b/clock/Library/Artifacts/78/788c2e328fca6991733e67798b16214a differ diff --git a/clock/Library/Artifacts/78/78a5c952acccf49445241de66763a334 b/clock/Library/Artifacts/78/78a5c952acccf49445241de66763a334 new file mode 100644 index 00000000..d27cab8f Binary files /dev/null and b/clock/Library/Artifacts/78/78a5c952acccf49445241de66763a334 differ diff --git a/clock/Library/Artifacts/78/78b2292e487341052f6e4b86a093eb7c b/clock/Library/Artifacts/78/78b2292e487341052f6e4b86a093eb7c new file mode 100644 index 00000000..6377ea5a Binary files /dev/null and b/clock/Library/Artifacts/78/78b2292e487341052f6e4b86a093eb7c differ diff --git a/clock/Library/Artifacts/78/78bd801a965e2310dcf191b3f6f438ce b/clock/Library/Artifacts/78/78bd801a965e2310dcf191b3f6f438ce new file mode 100644 index 00000000..042b8652 Binary files /dev/null and b/clock/Library/Artifacts/78/78bd801a965e2310dcf191b3f6f438ce differ diff --git a/clock/Library/Artifacts/78/78ced3357e8cf7e0d6378a07fc449985 b/clock/Library/Artifacts/78/78ced3357e8cf7e0d6378a07fc449985 new file mode 100644 index 00000000..c4557728 Binary files /dev/null and b/clock/Library/Artifacts/78/78ced3357e8cf7e0d6378a07fc449985 differ diff --git a/clock/Library/Artifacts/78/78f1f5b3abe0b7e54f144bb9fc139172 b/clock/Library/Artifacts/78/78f1f5b3abe0b7e54f144bb9fc139172 new file mode 100644 index 00000000..ffb6db06 Binary files /dev/null and b/clock/Library/Artifacts/78/78f1f5b3abe0b7e54f144bb9fc139172 differ diff --git a/clock/Library/Artifacts/79/790a622e218a6ef8c8c7e3636f82d71e b/clock/Library/Artifacts/79/790a622e218a6ef8c8c7e3636f82d71e new file mode 100644 index 00000000..08331a6c Binary files /dev/null and b/clock/Library/Artifacts/79/790a622e218a6ef8c8c7e3636f82d71e differ diff --git a/clock/Library/Artifacts/79/790bd43f7965ca0a9d59d49ce51915f2 b/clock/Library/Artifacts/79/790bd43f7965ca0a9d59d49ce51915f2 new file mode 100644 index 00000000..3c359ba9 Binary files /dev/null and b/clock/Library/Artifacts/79/790bd43f7965ca0a9d59d49ce51915f2 differ diff --git a/clock/Library/Artifacts/79/7915cc370a7bfdd895f4c422d8019778 b/clock/Library/Artifacts/79/7915cc370a7bfdd895f4c422d8019778 new file mode 100644 index 00000000..c4367e0b Binary files /dev/null and b/clock/Library/Artifacts/79/7915cc370a7bfdd895f4c422d8019778 differ diff --git a/clock/Library/Artifacts/79/7937afde80445c8fbac076fc5a0654d0 b/clock/Library/Artifacts/79/7937afde80445c8fbac076fc5a0654d0 new file mode 100644 index 00000000..dda60f83 Binary files /dev/null and b/clock/Library/Artifacts/79/7937afde80445c8fbac076fc5a0654d0 differ diff --git a/clock/Library/Artifacts/79/799f692d332a52406bb2002c4fe9d0ea b/clock/Library/Artifacts/79/799f692d332a52406bb2002c4fe9d0ea new file mode 100644 index 00000000..df943502 Binary files /dev/null and b/clock/Library/Artifacts/79/799f692d332a52406bb2002c4fe9d0ea differ diff --git a/clock/Library/Artifacts/79/79c695e0bb6e19becfb330452570592d b/clock/Library/Artifacts/79/79c695e0bb6e19becfb330452570592d new file mode 100644 index 00000000..f9476a6d Binary files /dev/null and b/clock/Library/Artifacts/79/79c695e0bb6e19becfb330452570592d differ diff --git a/clock/Library/Artifacts/79/79ec9924523cab891e1402fd42acd369 b/clock/Library/Artifacts/79/79ec9924523cab891e1402fd42acd369 new file mode 100644 index 00000000..7964e9b7 Binary files /dev/null and b/clock/Library/Artifacts/79/79ec9924523cab891e1402fd42acd369 differ diff --git a/clock/Library/Artifacts/7a/7a0d9c38fd948c543470189f13e79876 b/clock/Library/Artifacts/7a/7a0d9c38fd948c543470189f13e79876 new file mode 100644 index 00000000..d16fa2bf Binary files /dev/null and b/clock/Library/Artifacts/7a/7a0d9c38fd948c543470189f13e79876 differ diff --git a/clock/Library/Artifacts/7a/7a1ddd4bb62494c94d9a519402133b72 b/clock/Library/Artifacts/7a/7a1ddd4bb62494c94d9a519402133b72 new file mode 100644 index 00000000..a9fbb892 Binary files /dev/null and b/clock/Library/Artifacts/7a/7a1ddd4bb62494c94d9a519402133b72 differ diff --git a/clock/Library/Artifacts/7a/7a2254afcd0ad53f57a254bbe5c4760b b/clock/Library/Artifacts/7a/7a2254afcd0ad53f57a254bbe5c4760b new file mode 100644 index 00000000..603257de Binary files /dev/null and b/clock/Library/Artifacts/7a/7a2254afcd0ad53f57a254bbe5c4760b differ diff --git a/clock/Library/Artifacts/7a/7a2514421c7ce487e710f00f2998f9d2 b/clock/Library/Artifacts/7a/7a2514421c7ce487e710f00f2998f9d2 new file mode 100644 index 00000000..be33b49e Binary files /dev/null and b/clock/Library/Artifacts/7a/7a2514421c7ce487e710f00f2998f9d2 differ diff --git a/clock/Library/Artifacts/7a/7a2f5a41152fcbd8f6a0581f240cdf7a b/clock/Library/Artifacts/7a/7a2f5a41152fcbd8f6a0581f240cdf7a new file mode 100644 index 00000000..cd8b2bd6 Binary files /dev/null and b/clock/Library/Artifacts/7a/7a2f5a41152fcbd8f6a0581f240cdf7a differ diff --git a/clock/Library/Artifacts/7a/7aa23bc501dd203f04e075cd7418cda4 b/clock/Library/Artifacts/7a/7aa23bc501dd203f04e075cd7418cda4 new file mode 100644 index 00000000..1cf7a093 Binary files /dev/null and b/clock/Library/Artifacts/7a/7aa23bc501dd203f04e075cd7418cda4 differ diff --git a/clock/Library/Artifacts/7a/7ab1d9bea6bd4a0ab5e09550fb13c48e b/clock/Library/Artifacts/7a/7ab1d9bea6bd4a0ab5e09550fb13c48e new file mode 100644 index 00000000..fb361b67 Binary files /dev/null and b/clock/Library/Artifacts/7a/7ab1d9bea6bd4a0ab5e09550fb13c48e differ diff --git a/clock/Library/Artifacts/7a/7ad8c86d53a3722385dc8f44ca67d6af b/clock/Library/Artifacts/7a/7ad8c86d53a3722385dc8f44ca67d6af new file mode 100644 index 00000000..02610b78 Binary files /dev/null and b/clock/Library/Artifacts/7a/7ad8c86d53a3722385dc8f44ca67d6af differ diff --git a/clock/Library/Artifacts/7a/7afab06bcf38d65f5b45f7afa811c878 b/clock/Library/Artifacts/7a/7afab06bcf38d65f5b45f7afa811c878 new file mode 100644 index 00000000..86c8f53c Binary files /dev/null and b/clock/Library/Artifacts/7a/7afab06bcf38d65f5b45f7afa811c878 differ diff --git a/clock/Library/Artifacts/7b/7b0048b548625666c1f281beb76e571b b/clock/Library/Artifacts/7b/7b0048b548625666c1f281beb76e571b new file mode 100644 index 00000000..93ca7ad5 Binary files /dev/null and b/clock/Library/Artifacts/7b/7b0048b548625666c1f281beb76e571b differ diff --git a/clock/Library/Artifacts/7b/7b00e2bb82c4d7045962fc0e6f7185ea b/clock/Library/Artifacts/7b/7b00e2bb82c4d7045962fc0e6f7185ea new file mode 100644 index 00000000..abeeeec5 Binary files /dev/null and b/clock/Library/Artifacts/7b/7b00e2bb82c4d7045962fc0e6f7185ea differ diff --git a/clock/Library/Artifacts/7b/7b29fcaaaa08cc155f89502d1fcfab3f b/clock/Library/Artifacts/7b/7b29fcaaaa08cc155f89502d1fcfab3f new file mode 100644 index 00000000..20c8b942 Binary files /dev/null and b/clock/Library/Artifacts/7b/7b29fcaaaa08cc155f89502d1fcfab3f differ diff --git a/clock/Library/Artifacts/7b/7b95865b281db05aad1aaaa22d1e5fc6 b/clock/Library/Artifacts/7b/7b95865b281db05aad1aaaa22d1e5fc6 new file mode 100644 index 00000000..8282cf69 Binary files /dev/null and b/clock/Library/Artifacts/7b/7b95865b281db05aad1aaaa22d1e5fc6 differ diff --git a/clock/Library/Artifacts/7b/7bcf1c1dac433557299f90223a6b1796 b/clock/Library/Artifacts/7b/7bcf1c1dac433557299f90223a6b1796 new file mode 100644 index 00000000..7ba63e26 Binary files /dev/null and b/clock/Library/Artifacts/7b/7bcf1c1dac433557299f90223a6b1796 differ diff --git a/clock/Library/Artifacts/7c/7c8f4a9671ccf243e05fcc2716164092 b/clock/Library/Artifacts/7c/7c8f4a9671ccf243e05fcc2716164092 new file mode 100644 index 00000000..e8a24224 Binary files /dev/null and b/clock/Library/Artifacts/7c/7c8f4a9671ccf243e05fcc2716164092 differ diff --git a/clock/Library/Artifacts/7c/7c97c493dafce68bb2b711f1e7c82cc6 b/clock/Library/Artifacts/7c/7c97c493dafce68bb2b711f1e7c82cc6 new file mode 100644 index 00000000..bf7b7467 Binary files /dev/null and b/clock/Library/Artifacts/7c/7c97c493dafce68bb2b711f1e7c82cc6 differ diff --git a/clock/Library/Artifacts/7c/7cc42f952f18b0b5792b54b5d4d68ff5 b/clock/Library/Artifacts/7c/7cc42f952f18b0b5792b54b5d4d68ff5 new file mode 100644 index 00000000..be487074 Binary files /dev/null and b/clock/Library/Artifacts/7c/7cc42f952f18b0b5792b54b5d4d68ff5 differ diff --git a/clock/Library/Artifacts/7c/7cdcc76de87d4a31339ca7288e066b11 b/clock/Library/Artifacts/7c/7cdcc76de87d4a31339ca7288e066b11 new file mode 100644 index 00000000..03c43ae8 Binary files /dev/null and b/clock/Library/Artifacts/7c/7cdcc76de87d4a31339ca7288e066b11 differ diff --git a/clock/Library/Artifacts/7c/7cf76bd02d975d2736ce668337e102ba b/clock/Library/Artifacts/7c/7cf76bd02d975d2736ce668337e102ba new file mode 100644 index 00000000..59195b87 Binary files /dev/null and b/clock/Library/Artifacts/7c/7cf76bd02d975d2736ce668337e102ba differ diff --git a/clock/Library/Artifacts/7d/7d0d60ce57d239e39d31deee939e7db3 b/clock/Library/Artifacts/7d/7d0d60ce57d239e39d31deee939e7db3 new file mode 100644 index 00000000..fb4f0694 Binary files /dev/null and b/clock/Library/Artifacts/7d/7d0d60ce57d239e39d31deee939e7db3 differ diff --git a/clock/Library/Artifacts/7d/7d2b1b311591fc74b13b637f7eb260d9 b/clock/Library/Artifacts/7d/7d2b1b311591fc74b13b637f7eb260d9 new file mode 100644 index 00000000..e7ed25e3 Binary files /dev/null and b/clock/Library/Artifacts/7d/7d2b1b311591fc74b13b637f7eb260d9 differ diff --git a/clock/Library/Artifacts/7d/7d4debe93281cba6593c4e3c332f5ff5 b/clock/Library/Artifacts/7d/7d4debe93281cba6593c4e3c332f5ff5 new file mode 100644 index 00000000..56fb155e Binary files /dev/null and b/clock/Library/Artifacts/7d/7d4debe93281cba6593c4e3c332f5ff5 differ diff --git a/clock/Library/Artifacts/7d/7d603dd8de48f60c3a733b4795368d11 b/clock/Library/Artifacts/7d/7d603dd8de48f60c3a733b4795368d11 new file mode 100644 index 00000000..e2a5c98e Binary files /dev/null and b/clock/Library/Artifacts/7d/7d603dd8de48f60c3a733b4795368d11 differ diff --git a/clock/Library/Artifacts/7d/7db8f8476683c5a8e155556f5006617f b/clock/Library/Artifacts/7d/7db8f8476683c5a8e155556f5006617f new file mode 100644 index 00000000..786b6337 Binary files /dev/null and b/clock/Library/Artifacts/7d/7db8f8476683c5a8e155556f5006617f differ diff --git a/clock/Library/Artifacts/7e/7e01561233644e028ea51dfa90cdfa74 b/clock/Library/Artifacts/7e/7e01561233644e028ea51dfa90cdfa74 new file mode 100644 index 00000000..7b06c5d0 Binary files /dev/null and b/clock/Library/Artifacts/7e/7e01561233644e028ea51dfa90cdfa74 differ diff --git a/clock/Library/Artifacts/7e/7e1970ebd17701d8fa385b372cc52ff0 b/clock/Library/Artifacts/7e/7e1970ebd17701d8fa385b372cc52ff0 new file mode 100644 index 00000000..dc14125b Binary files /dev/null and b/clock/Library/Artifacts/7e/7e1970ebd17701d8fa385b372cc52ff0 differ diff --git a/clock/Library/Artifacts/7e/7e2ae2bc3d7021e6081c4e20cfbd5c92 b/clock/Library/Artifacts/7e/7e2ae2bc3d7021e6081c4e20cfbd5c92 new file mode 100644 index 00000000..85888882 Binary files /dev/null and b/clock/Library/Artifacts/7e/7e2ae2bc3d7021e6081c4e20cfbd5c92 differ diff --git a/clock/Library/Artifacts/7e/7e3aef92c96fd24d948abc574a1ec96f b/clock/Library/Artifacts/7e/7e3aef92c96fd24d948abc574a1ec96f new file mode 100644 index 00000000..d40b74fc Binary files /dev/null and b/clock/Library/Artifacts/7e/7e3aef92c96fd24d948abc574a1ec96f differ diff --git a/clock/Library/Artifacts/7e/7e40ff22153fd1475181849bd475cf39 b/clock/Library/Artifacts/7e/7e40ff22153fd1475181849bd475cf39 new file mode 100644 index 00000000..06f84ff0 Binary files /dev/null and b/clock/Library/Artifacts/7e/7e40ff22153fd1475181849bd475cf39 differ diff --git a/clock/Library/Artifacts/7e/7e605654b516a8183eb17fd9d100f482 b/clock/Library/Artifacts/7e/7e605654b516a8183eb17fd9d100f482 new file mode 100644 index 00000000..9d9b131d Binary files /dev/null and b/clock/Library/Artifacts/7e/7e605654b516a8183eb17fd9d100f482 differ diff --git a/clock/Library/Artifacts/7e/7e67b2347cb3bc02231bd06731ffb97b b/clock/Library/Artifacts/7e/7e67b2347cb3bc02231bd06731ffb97b new file mode 100644 index 00000000..574aad22 Binary files /dev/null and b/clock/Library/Artifacts/7e/7e67b2347cb3bc02231bd06731ffb97b differ diff --git a/clock/Library/Artifacts/7e/7ea33a85018204c2f62bc117cb57dc62 b/clock/Library/Artifacts/7e/7ea33a85018204c2f62bc117cb57dc62 new file mode 100644 index 00000000..ac212e85 Binary files /dev/null and b/clock/Library/Artifacts/7e/7ea33a85018204c2f62bc117cb57dc62 differ diff --git a/clock/Library/Artifacts/7e/7ed82b5e448fb2ed8533311193cf20ce b/clock/Library/Artifacts/7e/7ed82b5e448fb2ed8533311193cf20ce new file mode 100644 index 00000000..62594de4 Binary files /dev/null and b/clock/Library/Artifacts/7e/7ed82b5e448fb2ed8533311193cf20ce differ diff --git a/clock/Library/Artifacts/7e/7ee4658e446231691ebd9b672682e1fd b/clock/Library/Artifacts/7e/7ee4658e446231691ebd9b672682e1fd new file mode 100644 index 00000000..a87b4f0b Binary files /dev/null and b/clock/Library/Artifacts/7e/7ee4658e446231691ebd9b672682e1fd differ diff --git a/clock/Library/Artifacts/7e/7ef1fa9f16c5bb2901634570c31d78a9 b/clock/Library/Artifacts/7e/7ef1fa9f16c5bb2901634570c31d78a9 new file mode 100644 index 00000000..80eb3153 Binary files /dev/null and b/clock/Library/Artifacts/7e/7ef1fa9f16c5bb2901634570c31d78a9 differ diff --git a/clock/Library/Artifacts/7f/7f26aa7fe95961a53ba4b8938c7e85ca b/clock/Library/Artifacts/7f/7f26aa7fe95961a53ba4b8938c7e85ca new file mode 100644 index 00000000..a8ed184a Binary files /dev/null and b/clock/Library/Artifacts/7f/7f26aa7fe95961a53ba4b8938c7e85ca differ diff --git a/clock/Library/Artifacts/7f/7f4904b4efeffadcaeebc5f3d6c304a4 b/clock/Library/Artifacts/7f/7f4904b4efeffadcaeebc5f3d6c304a4 new file mode 100644 index 00000000..56f7051f Binary files /dev/null and b/clock/Library/Artifacts/7f/7f4904b4efeffadcaeebc5f3d6c304a4 differ diff --git a/clock/Library/Artifacts/7f/7f6112fa885b1b033598d5fcb4fa8388 b/clock/Library/Artifacts/7f/7f6112fa885b1b033598d5fcb4fa8388 new file mode 100644 index 00000000..243dd5fc Binary files /dev/null and b/clock/Library/Artifacts/7f/7f6112fa885b1b033598d5fcb4fa8388 differ diff --git a/clock/Library/Artifacts/7f/7f6ecefbc093c6b18667ca4229a51dff b/clock/Library/Artifacts/7f/7f6ecefbc093c6b18667ca4229a51dff new file mode 100644 index 00000000..0ddc7df6 Binary files /dev/null and b/clock/Library/Artifacts/7f/7f6ecefbc093c6b18667ca4229a51dff differ diff --git a/clock/Library/Artifacts/7f/7f8f83ea308854c924ce661ca28929aa b/clock/Library/Artifacts/7f/7f8f83ea308854c924ce661ca28929aa new file mode 100644 index 00000000..84a48ffb Binary files /dev/null and b/clock/Library/Artifacts/7f/7f8f83ea308854c924ce661ca28929aa differ diff --git a/clock/Library/Artifacts/7f/7f9f9a327fc06c25167681145f4e95b0 b/clock/Library/Artifacts/7f/7f9f9a327fc06c25167681145f4e95b0 new file mode 100644 index 00000000..15ed65f5 Binary files /dev/null and b/clock/Library/Artifacts/7f/7f9f9a327fc06c25167681145f4e95b0 differ diff --git a/clock/Library/Artifacts/7f/7fe6702041ad4eb77bc6822232da8c81 b/clock/Library/Artifacts/7f/7fe6702041ad4eb77bc6822232da8c81 new file mode 100644 index 00000000..2770bcf9 Binary files /dev/null and b/clock/Library/Artifacts/7f/7fe6702041ad4eb77bc6822232da8c81 differ diff --git a/clock/Library/Artifacts/80/8029c08e443edc7a2d49ba78f2a9ff22 b/clock/Library/Artifacts/80/8029c08e443edc7a2d49ba78f2a9ff22 new file mode 100644 index 00000000..ce90ee12 Binary files /dev/null and b/clock/Library/Artifacts/80/8029c08e443edc7a2d49ba78f2a9ff22 differ diff --git a/clock/Library/Artifacts/80/807964c728d163b42966204bcab0ca69 b/clock/Library/Artifacts/80/807964c728d163b42966204bcab0ca69 new file mode 100644 index 00000000..e1c00b96 Binary files /dev/null and b/clock/Library/Artifacts/80/807964c728d163b42966204bcab0ca69 differ diff --git a/clock/Library/Artifacts/80/808097c3d9855865df44aad71f55f5b5 b/clock/Library/Artifacts/80/808097c3d9855865df44aad71f55f5b5 new file mode 100644 index 00000000..ea865642 Binary files /dev/null and b/clock/Library/Artifacts/80/808097c3d9855865df44aad71f55f5b5 differ diff --git a/clock/Library/Artifacts/80/80c29dc1dea3741586f3bf1d152425e1 b/clock/Library/Artifacts/80/80c29dc1dea3741586f3bf1d152425e1 new file mode 100644 index 00000000..517ec762 Binary files /dev/null and b/clock/Library/Artifacts/80/80c29dc1dea3741586f3bf1d152425e1 differ diff --git a/clock/Library/Artifacts/80/80d57d55be484729a3b75b08ef721d85 b/clock/Library/Artifacts/80/80d57d55be484729a3b75b08ef721d85 new file mode 100644 index 00000000..d5dd702e Binary files /dev/null and b/clock/Library/Artifacts/80/80d57d55be484729a3b75b08ef721d85 differ diff --git a/clock/Library/Artifacts/81/815086ddb30aeccf549df9dd588ed2ce b/clock/Library/Artifacts/81/815086ddb30aeccf549df9dd588ed2ce new file mode 100644 index 00000000..dd414616 Binary files /dev/null and b/clock/Library/Artifacts/81/815086ddb30aeccf549df9dd588ed2ce differ diff --git a/clock/Library/Artifacts/81/8195a05dbcbdd84a49281490db17784b b/clock/Library/Artifacts/81/8195a05dbcbdd84a49281490db17784b new file mode 100644 index 00000000..17046bcb Binary files /dev/null and b/clock/Library/Artifacts/81/8195a05dbcbdd84a49281490db17784b differ diff --git a/clock/Library/Artifacts/82/8209746c6d8a8ce96332109e24063cdb b/clock/Library/Artifacts/82/8209746c6d8a8ce96332109e24063cdb new file mode 100644 index 00000000..d2c3e982 Binary files /dev/null and b/clock/Library/Artifacts/82/8209746c6d8a8ce96332109e24063cdb differ diff --git a/clock/Library/Artifacts/82/821264e963d2d3aa512bfc57d97b6189 b/clock/Library/Artifacts/82/821264e963d2d3aa512bfc57d97b6189 new file mode 100644 index 00000000..a67dee59 Binary files /dev/null and b/clock/Library/Artifacts/82/821264e963d2d3aa512bfc57d97b6189 differ diff --git a/clock/Library/Artifacts/82/8236d80f4ac0a425a53356bae4272b94 b/clock/Library/Artifacts/82/8236d80f4ac0a425a53356bae4272b94 new file mode 100644 index 00000000..892bd965 Binary files /dev/null and b/clock/Library/Artifacts/82/8236d80f4ac0a425a53356bae4272b94 differ diff --git a/clock/Library/Artifacts/82/8250c4d8b94741a02d8baa843dfd2d95 b/clock/Library/Artifacts/82/8250c4d8b94741a02d8baa843dfd2d95 new file mode 100644 index 00000000..378b9c30 Binary files /dev/null and b/clock/Library/Artifacts/82/8250c4d8b94741a02d8baa843dfd2d95 differ diff --git a/clock/Library/Artifacts/82/82563ec4d51d5a9e913e52419fad4f32 b/clock/Library/Artifacts/82/82563ec4d51d5a9e913e52419fad4f32 new file mode 100644 index 00000000..4b881005 Binary files /dev/null and b/clock/Library/Artifacts/82/82563ec4d51d5a9e913e52419fad4f32 differ diff --git a/clock/Library/Artifacts/82/82641833657a0946bab7040027eb210c b/clock/Library/Artifacts/82/82641833657a0946bab7040027eb210c new file mode 100644 index 00000000..28bf09ca Binary files /dev/null and b/clock/Library/Artifacts/82/82641833657a0946bab7040027eb210c differ diff --git a/clock/Library/Artifacts/82/826f933060fc58333bd19621634d9298 b/clock/Library/Artifacts/82/826f933060fc58333bd19621634d9298 new file mode 100644 index 00000000..ce07ef94 Binary files /dev/null and b/clock/Library/Artifacts/82/826f933060fc58333bd19621634d9298 differ diff --git a/clock/Library/Artifacts/82/828bfe088cf46c450b7cad194d024e82 b/clock/Library/Artifacts/82/828bfe088cf46c450b7cad194d024e82 new file mode 100644 index 00000000..9be4743a Binary files /dev/null and b/clock/Library/Artifacts/82/828bfe088cf46c450b7cad194d024e82 differ diff --git a/clock/Library/Artifacts/82/82bd59fce4f3136ca1a27e29c09867bb b/clock/Library/Artifacts/82/82bd59fce4f3136ca1a27e29c09867bb new file mode 100644 index 00000000..288b1966 Binary files /dev/null and b/clock/Library/Artifacts/82/82bd59fce4f3136ca1a27e29c09867bb differ diff --git a/clock/Library/Artifacts/82/82e51fde5bda9062463056b6b2f57a2d b/clock/Library/Artifacts/82/82e51fde5bda9062463056b6b2f57a2d new file mode 100644 index 00000000..2bb5920a Binary files /dev/null and b/clock/Library/Artifacts/82/82e51fde5bda9062463056b6b2f57a2d differ diff --git a/clock/Library/Artifacts/83/83005e9838e18b2f7bf551fa3c4dbaf1 b/clock/Library/Artifacts/83/83005e9838e18b2f7bf551fa3c4dbaf1 new file mode 100644 index 00000000..397eab7d Binary files /dev/null and b/clock/Library/Artifacts/83/83005e9838e18b2f7bf551fa3c4dbaf1 differ diff --git a/clock/Library/Artifacts/83/83634820c59d20ca36bb768a885d08f3 b/clock/Library/Artifacts/83/83634820c59d20ca36bb768a885d08f3 new file mode 100644 index 00000000..1c84a364 Binary files /dev/null and b/clock/Library/Artifacts/83/83634820c59d20ca36bb768a885d08f3 differ diff --git a/clock/Library/Artifacts/83/836a6e98397ff471618a436f85cd1bfc b/clock/Library/Artifacts/83/836a6e98397ff471618a436f85cd1bfc new file mode 100644 index 00000000..ba777dfd Binary files /dev/null and b/clock/Library/Artifacts/83/836a6e98397ff471618a436f85cd1bfc differ diff --git a/clock/Library/Artifacts/83/8385d8badda2b07f899765098f9eb5b9 b/clock/Library/Artifacts/83/8385d8badda2b07f899765098f9eb5b9 new file mode 100644 index 00000000..cf7086ed Binary files /dev/null and b/clock/Library/Artifacts/83/8385d8badda2b07f899765098f9eb5b9 differ diff --git a/clock/Library/Artifacts/83/839a548905ff8a31f8b74dc650d3dad0 b/clock/Library/Artifacts/83/839a548905ff8a31f8b74dc650d3dad0 new file mode 100644 index 00000000..edf04e97 Binary files /dev/null and b/clock/Library/Artifacts/83/839a548905ff8a31f8b74dc650d3dad0 differ diff --git a/clock/Library/Artifacts/83/83a43593ec482460c58dc2754ac908aa b/clock/Library/Artifacts/83/83a43593ec482460c58dc2754ac908aa new file mode 100644 index 00000000..6c7e4f90 Binary files /dev/null and b/clock/Library/Artifacts/83/83a43593ec482460c58dc2754ac908aa differ diff --git a/clock/Library/Artifacts/83/83abb6e7f472848620aef1c786634fe0 b/clock/Library/Artifacts/83/83abb6e7f472848620aef1c786634fe0 new file mode 100644 index 00000000..5f3c08fb Binary files /dev/null and b/clock/Library/Artifacts/83/83abb6e7f472848620aef1c786634fe0 differ diff --git a/clock/Library/Artifacts/83/83bbc111553425d29e938509690e8ac9 b/clock/Library/Artifacts/83/83bbc111553425d29e938509690e8ac9 new file mode 100644 index 00000000..a9971534 Binary files /dev/null and b/clock/Library/Artifacts/83/83bbc111553425d29e938509690e8ac9 differ diff --git a/clock/Library/Artifacts/83/83bc10f7a0265d16b096c88c12b425d9 b/clock/Library/Artifacts/83/83bc10f7a0265d16b096c88c12b425d9 new file mode 100644 index 00000000..a55db6f6 Binary files /dev/null and b/clock/Library/Artifacts/83/83bc10f7a0265d16b096c88c12b425d9 differ diff --git a/clock/Library/Artifacts/83/83cdbfeb57dd6b7703fde4fab4b221ec b/clock/Library/Artifacts/83/83cdbfeb57dd6b7703fde4fab4b221ec new file mode 100644 index 00000000..2e2ab106 Binary files /dev/null and b/clock/Library/Artifacts/83/83cdbfeb57dd6b7703fde4fab4b221ec differ diff --git a/clock/Library/Artifacts/83/83f0fb0bab37bbc4454e7e8e1ada9d8d b/clock/Library/Artifacts/83/83f0fb0bab37bbc4454e7e8e1ada9d8d new file mode 100644 index 00000000..960f4ee5 Binary files /dev/null and b/clock/Library/Artifacts/83/83f0fb0bab37bbc4454e7e8e1ada9d8d differ diff --git a/clock/Library/Artifacts/84/842c1383e21a4e71cc4945aa09bd1f38 b/clock/Library/Artifacts/84/842c1383e21a4e71cc4945aa09bd1f38 new file mode 100644 index 00000000..3d403b0f Binary files /dev/null and b/clock/Library/Artifacts/84/842c1383e21a4e71cc4945aa09bd1f38 differ diff --git a/clock/Library/Artifacts/84/8441196ef222177c647391d3de5c23ab b/clock/Library/Artifacts/84/8441196ef222177c647391d3de5c23ab new file mode 100644 index 00000000..8e7ca16d Binary files /dev/null and b/clock/Library/Artifacts/84/8441196ef222177c647391d3de5c23ab differ diff --git a/clock/Library/Artifacts/84/846dbdd5457c549420e6bc689a89bbe2 b/clock/Library/Artifacts/84/846dbdd5457c549420e6bc689a89bbe2 new file mode 100644 index 00000000..0e0758d9 Binary files /dev/null and b/clock/Library/Artifacts/84/846dbdd5457c549420e6bc689a89bbe2 differ diff --git a/clock/Library/Artifacts/84/84b095bef4b01a03eac88879444aaf97 b/clock/Library/Artifacts/84/84b095bef4b01a03eac88879444aaf97 new file mode 100644 index 00000000..82e61619 Binary files /dev/null and b/clock/Library/Artifacts/84/84b095bef4b01a03eac88879444aaf97 differ diff --git a/clock/Library/Artifacts/84/84d361c3649b5f0a7c301d7e0ea5d3dc b/clock/Library/Artifacts/84/84d361c3649b5f0a7c301d7e0ea5d3dc new file mode 100644 index 00000000..488a8737 Binary files /dev/null and b/clock/Library/Artifacts/84/84d361c3649b5f0a7c301d7e0ea5d3dc differ diff --git a/clock/Library/Artifacts/84/84e74dc0c2f394404673d2022ae62c7e b/clock/Library/Artifacts/84/84e74dc0c2f394404673d2022ae62c7e new file mode 100644 index 00000000..a24f98f7 Binary files /dev/null and b/clock/Library/Artifacts/84/84e74dc0c2f394404673d2022ae62c7e differ diff --git a/clock/Library/Artifacts/85/856930670378f98c50919302c2969495 b/clock/Library/Artifacts/85/856930670378f98c50919302c2969495 new file mode 100644 index 00000000..788a74d8 Binary files /dev/null and b/clock/Library/Artifacts/85/856930670378f98c50919302c2969495 differ diff --git a/clock/Library/Artifacts/85/85c9b223384f2d321bad364b289bee33 b/clock/Library/Artifacts/85/85c9b223384f2d321bad364b289bee33 new file mode 100644 index 00000000..2b6b177b Binary files /dev/null and b/clock/Library/Artifacts/85/85c9b223384f2d321bad364b289bee33 differ diff --git a/clock/Library/Artifacts/85/85d28e6ab3d417ba22fb14a6e49dd779 b/clock/Library/Artifacts/85/85d28e6ab3d417ba22fb14a6e49dd779 new file mode 100644 index 00000000..78e2d3ef Binary files /dev/null and b/clock/Library/Artifacts/85/85d28e6ab3d417ba22fb14a6e49dd779 differ diff --git a/clock/Library/Artifacts/86/8605de2043d8d27cd90a3543530e7933 b/clock/Library/Artifacts/86/8605de2043d8d27cd90a3543530e7933 new file mode 100644 index 00000000..ac5a3c16 Binary files /dev/null and b/clock/Library/Artifacts/86/8605de2043d8d27cd90a3543530e7933 differ diff --git a/clock/Library/Artifacts/86/86328839b08dae07c52ad42b06dbdcdc b/clock/Library/Artifacts/86/86328839b08dae07c52ad42b06dbdcdc new file mode 100644 index 00000000..10d65982 Binary files /dev/null and b/clock/Library/Artifacts/86/86328839b08dae07c52ad42b06dbdcdc differ diff --git a/clock/Library/Artifacts/86/863d94ba9eea1b3589c41961f086dd89 b/clock/Library/Artifacts/86/863d94ba9eea1b3589c41961f086dd89 new file mode 100644 index 00000000..8047a1f0 Binary files /dev/null and b/clock/Library/Artifacts/86/863d94ba9eea1b3589c41961f086dd89 differ diff --git a/clock/Library/Artifacts/86/8657f225634608615bab32beca61b54a b/clock/Library/Artifacts/86/8657f225634608615bab32beca61b54a new file mode 100644 index 00000000..42bb6e03 Binary files /dev/null and b/clock/Library/Artifacts/86/8657f225634608615bab32beca61b54a differ diff --git a/clock/Library/Artifacts/86/86e126d96cbbd909f2655fc475381866 b/clock/Library/Artifacts/86/86e126d96cbbd909f2655fc475381866 new file mode 100644 index 00000000..1138a37b Binary files /dev/null and b/clock/Library/Artifacts/86/86e126d96cbbd909f2655fc475381866 differ diff --git a/clock/Library/Artifacts/87/874f466dc63f12955402e50ccce04f6e b/clock/Library/Artifacts/87/874f466dc63f12955402e50ccce04f6e new file mode 100644 index 00000000..9d645e78 Binary files /dev/null and b/clock/Library/Artifacts/87/874f466dc63f12955402e50ccce04f6e differ diff --git a/clock/Library/Artifacts/87/875f1767a78d900265da31231f4a62d8 b/clock/Library/Artifacts/87/875f1767a78d900265da31231f4a62d8 new file mode 100644 index 00000000..fb283465 Binary files /dev/null and b/clock/Library/Artifacts/87/875f1767a78d900265da31231f4a62d8 differ diff --git a/clock/Library/Artifacts/87/877454ac84423765c33ae94ef7fd9606 b/clock/Library/Artifacts/87/877454ac84423765c33ae94ef7fd9606 new file mode 100644 index 00000000..250298d6 Binary files /dev/null and b/clock/Library/Artifacts/87/877454ac84423765c33ae94ef7fd9606 differ diff --git a/clock/Library/Artifacts/87/87a05e0df32663acbe27a16b7c974b26 b/clock/Library/Artifacts/87/87a05e0df32663acbe27a16b7c974b26 new file mode 100644 index 00000000..2a95a960 Binary files /dev/null and b/clock/Library/Artifacts/87/87a05e0df32663acbe27a16b7c974b26 differ diff --git a/clock/Library/Artifacts/87/87ff259526b0dbae836052faa7d8ced1 b/clock/Library/Artifacts/87/87ff259526b0dbae836052faa7d8ced1 new file mode 100644 index 00000000..ce6e0c72 Binary files /dev/null and b/clock/Library/Artifacts/87/87ff259526b0dbae836052faa7d8ced1 differ diff --git a/clock/Library/Artifacts/88/8804a9309143f871c8df80d29f6445d9 b/clock/Library/Artifacts/88/8804a9309143f871c8df80d29f6445d9 new file mode 100644 index 00000000..00dc66d2 Binary files /dev/null and b/clock/Library/Artifacts/88/8804a9309143f871c8df80d29f6445d9 differ diff --git a/clock/Library/Artifacts/88/8830366a1c77f56a3ed0b8959081ee1a b/clock/Library/Artifacts/88/8830366a1c77f56a3ed0b8959081ee1a new file mode 100644 index 00000000..15ac337a Binary files /dev/null and b/clock/Library/Artifacts/88/8830366a1c77f56a3ed0b8959081ee1a differ diff --git a/clock/Library/Artifacts/88/883c7c861e63acb20d0a2eab22fbe989 b/clock/Library/Artifacts/88/883c7c861e63acb20d0a2eab22fbe989 new file mode 100644 index 00000000..5ce8ce0e Binary files /dev/null and b/clock/Library/Artifacts/88/883c7c861e63acb20d0a2eab22fbe989 differ diff --git a/clock/Library/Artifacts/88/8861c1ba28838eeb8a79ca2f37582007 b/clock/Library/Artifacts/88/8861c1ba28838eeb8a79ca2f37582007 new file mode 100644 index 00000000..80d6984a Binary files /dev/null and b/clock/Library/Artifacts/88/8861c1ba28838eeb8a79ca2f37582007 differ diff --git a/clock/Library/Artifacts/88/8869b4162ab4fea4faf08d4513ba8775 b/clock/Library/Artifacts/88/8869b4162ab4fea4faf08d4513ba8775 new file mode 100644 index 00000000..75ab2406 Binary files /dev/null and b/clock/Library/Artifacts/88/8869b4162ab4fea4faf08d4513ba8775 differ diff --git a/clock/Library/Artifacts/88/88792597092b93812b9989908ca88239 b/clock/Library/Artifacts/88/88792597092b93812b9989908ca88239 new file mode 100644 index 00000000..33ebe80d Binary files /dev/null and b/clock/Library/Artifacts/88/88792597092b93812b9989908ca88239 differ diff --git a/clock/Library/Artifacts/88/88adcb8fed86831c0288bbfad8285581 b/clock/Library/Artifacts/88/88adcb8fed86831c0288bbfad8285581 new file mode 100644 index 00000000..f6cdb24f Binary files /dev/null and b/clock/Library/Artifacts/88/88adcb8fed86831c0288bbfad8285581 differ diff --git a/clock/Library/Artifacts/89/89201c94bfc84f48ca5e094599325530 b/clock/Library/Artifacts/89/89201c94bfc84f48ca5e094599325530 new file mode 100644 index 00000000..444273ab Binary files /dev/null and b/clock/Library/Artifacts/89/89201c94bfc84f48ca5e094599325530 differ diff --git a/clock/Library/Artifacts/89/89479e399a8dc5926776dbebb8f0adbc b/clock/Library/Artifacts/89/89479e399a8dc5926776dbebb8f0adbc new file mode 100644 index 00000000..e8dc2d0a Binary files /dev/null and b/clock/Library/Artifacts/89/89479e399a8dc5926776dbebb8f0adbc differ diff --git a/clock/Library/Artifacts/89/89546dce869c342c6bf47d6d31b51271 b/clock/Library/Artifacts/89/89546dce869c342c6bf47d6d31b51271 new file mode 100644 index 00000000..26043745 Binary files /dev/null and b/clock/Library/Artifacts/89/89546dce869c342c6bf47d6d31b51271 differ diff --git a/clock/Library/Artifacts/89/8989d5303df383daba00c6f47a633766 b/clock/Library/Artifacts/89/8989d5303df383daba00c6f47a633766 new file mode 100644 index 00000000..9afab3da Binary files /dev/null and b/clock/Library/Artifacts/89/8989d5303df383daba00c6f47a633766 differ diff --git a/clock/Library/Artifacts/89/89afc434c7e183ed39a4b9324c1258cd b/clock/Library/Artifacts/89/89afc434c7e183ed39a4b9324c1258cd new file mode 100644 index 00000000..f32690c3 Binary files /dev/null and b/clock/Library/Artifacts/89/89afc434c7e183ed39a4b9324c1258cd differ diff --git a/clock/Library/Artifacts/89/89e87464d9bfb1d39e531ee233514044 b/clock/Library/Artifacts/89/89e87464d9bfb1d39e531ee233514044 new file mode 100644 index 00000000..683542a9 Binary files /dev/null and b/clock/Library/Artifacts/89/89e87464d9bfb1d39e531ee233514044 differ diff --git a/clock/Library/Artifacts/8a/8a52d9d8734d6ed684606bb59e49f010 b/clock/Library/Artifacts/8a/8a52d9d8734d6ed684606bb59e49f010 new file mode 100644 index 00000000..47998f3d Binary files /dev/null and b/clock/Library/Artifacts/8a/8a52d9d8734d6ed684606bb59e49f010 differ diff --git a/clock/Library/Artifacts/8a/8a9907ca198749bf8f6c6f8102a71cb1 b/clock/Library/Artifacts/8a/8a9907ca198749bf8f6c6f8102a71cb1 new file mode 100644 index 00000000..6cc8d16e Binary files /dev/null and b/clock/Library/Artifacts/8a/8a9907ca198749bf8f6c6f8102a71cb1 differ diff --git a/clock/Library/Artifacts/8a/8a9ab5d7d0db4bd55a400eca0e95da81 b/clock/Library/Artifacts/8a/8a9ab5d7d0db4bd55a400eca0e95da81 new file mode 100644 index 00000000..57a90c6f Binary files /dev/null and b/clock/Library/Artifacts/8a/8a9ab5d7d0db4bd55a400eca0e95da81 differ diff --git a/clock/Library/Artifacts/8a/8ab8290436a50538ce89b0b5102969cf b/clock/Library/Artifacts/8a/8ab8290436a50538ce89b0b5102969cf new file mode 100644 index 00000000..c599d169 Binary files /dev/null and b/clock/Library/Artifacts/8a/8ab8290436a50538ce89b0b5102969cf differ diff --git a/clock/Library/Artifacts/8b/8b453e655db8d20513a9250c142f8b9e b/clock/Library/Artifacts/8b/8b453e655db8d20513a9250c142f8b9e new file mode 100644 index 00000000..32f065f5 Binary files /dev/null and b/clock/Library/Artifacts/8b/8b453e655db8d20513a9250c142f8b9e differ diff --git a/clock/Library/Artifacts/8b/8b4b94909da6ea7719bf7842df68f25d b/clock/Library/Artifacts/8b/8b4b94909da6ea7719bf7842df68f25d new file mode 100644 index 00000000..db26257b Binary files /dev/null and b/clock/Library/Artifacts/8b/8b4b94909da6ea7719bf7842df68f25d differ diff --git a/clock/Library/Artifacts/8b/8bfcbe2524b8f7242160ef5c0f52109a b/clock/Library/Artifacts/8b/8bfcbe2524b8f7242160ef5c0f52109a new file mode 100644 index 00000000..28a5f032 Binary files /dev/null and b/clock/Library/Artifacts/8b/8bfcbe2524b8f7242160ef5c0f52109a differ diff --git a/clock/Library/Artifacts/8c/8c13dea8cfe0613a3d586d83eee109aa b/clock/Library/Artifacts/8c/8c13dea8cfe0613a3d586d83eee109aa new file mode 100644 index 00000000..6b29ba31 Binary files /dev/null and b/clock/Library/Artifacts/8c/8c13dea8cfe0613a3d586d83eee109aa differ diff --git a/clock/Library/Artifacts/8c/8c483d9e1be5112671cc1294359232d7 b/clock/Library/Artifacts/8c/8c483d9e1be5112671cc1294359232d7 new file mode 100644 index 00000000..089b5296 Binary files /dev/null and b/clock/Library/Artifacts/8c/8c483d9e1be5112671cc1294359232d7 differ diff --git a/clock/Library/Artifacts/8c/8c57bbb27c2484910d4ce56eaa41fb1e b/clock/Library/Artifacts/8c/8c57bbb27c2484910d4ce56eaa41fb1e new file mode 100644 index 00000000..6a211ae9 Binary files /dev/null and b/clock/Library/Artifacts/8c/8c57bbb27c2484910d4ce56eaa41fb1e differ diff --git a/clock/Library/Artifacts/8c/8c9bbaf146fe41a53969c979c62a0dd8 b/clock/Library/Artifacts/8c/8c9bbaf146fe41a53969c979c62a0dd8 new file mode 100644 index 00000000..e0682912 Binary files /dev/null and b/clock/Library/Artifacts/8c/8c9bbaf146fe41a53969c979c62a0dd8 differ diff --git a/clock/Library/Artifacts/8c/8cb1cd3622cd11fc1c77162469b5cf5f b/clock/Library/Artifacts/8c/8cb1cd3622cd11fc1c77162469b5cf5f new file mode 100644 index 00000000..1467273e Binary files /dev/null and b/clock/Library/Artifacts/8c/8cb1cd3622cd11fc1c77162469b5cf5f differ diff --git a/clock/Library/Artifacts/8c/8cb2c58421b9b1483f4ba367828b8449 b/clock/Library/Artifacts/8c/8cb2c58421b9b1483f4ba367828b8449 new file mode 100644 index 00000000..b4b76492 Binary files /dev/null and b/clock/Library/Artifacts/8c/8cb2c58421b9b1483f4ba367828b8449 differ diff --git a/clock/Library/Artifacts/8c/8cf74902f6d9d5f1c571e436985f1d5e b/clock/Library/Artifacts/8c/8cf74902f6d9d5f1c571e436985f1d5e new file mode 100644 index 00000000..9f9f91cf Binary files /dev/null and b/clock/Library/Artifacts/8c/8cf74902f6d9d5f1c571e436985f1d5e differ diff --git a/clock/Library/Artifacts/8d/8d31266edf3b3091803b295e4e826709 b/clock/Library/Artifacts/8d/8d31266edf3b3091803b295e4e826709 new file mode 100644 index 00000000..fb150dcf Binary files /dev/null and b/clock/Library/Artifacts/8d/8d31266edf3b3091803b295e4e826709 differ diff --git a/clock/Library/Artifacts/8d/8d5d64adb8bf47715e5010dc69fb37c2 b/clock/Library/Artifacts/8d/8d5d64adb8bf47715e5010dc69fb37c2 new file mode 100644 index 00000000..123b01d5 Binary files /dev/null and b/clock/Library/Artifacts/8d/8d5d64adb8bf47715e5010dc69fb37c2 differ diff --git a/clock/Library/Artifacts/8d/8d92a57e371f4aabc58a9c5e5a7934cb b/clock/Library/Artifacts/8d/8d92a57e371f4aabc58a9c5e5a7934cb new file mode 100644 index 00000000..b9c71350 Binary files /dev/null and b/clock/Library/Artifacts/8d/8d92a57e371f4aabc58a9c5e5a7934cb differ diff --git a/clock/Library/Artifacts/8d/8db2a425c4a18d272d95a37d7de466f8 b/clock/Library/Artifacts/8d/8db2a425c4a18d272d95a37d7de466f8 new file mode 100644 index 00000000..e22b7374 Binary files /dev/null and b/clock/Library/Artifacts/8d/8db2a425c4a18d272d95a37d7de466f8 differ diff --git a/clock/Library/Artifacts/8e/8e2936a5c0b47fd8e65dfdd3b411db47 b/clock/Library/Artifacts/8e/8e2936a5c0b47fd8e65dfdd3b411db47 new file mode 100644 index 00000000..bd558705 Binary files /dev/null and b/clock/Library/Artifacts/8e/8e2936a5c0b47fd8e65dfdd3b411db47 differ diff --git a/clock/Library/Artifacts/8e/8e372c5e92f7b0bfb7d0a5fef938248c b/clock/Library/Artifacts/8e/8e372c5e92f7b0bfb7d0a5fef938248c new file mode 100644 index 00000000..8b3a729e Binary files /dev/null and b/clock/Library/Artifacts/8e/8e372c5e92f7b0bfb7d0a5fef938248c differ diff --git a/clock/Library/Artifacts/8e/8ea9040eea32abd9f7d2798abbe196ef b/clock/Library/Artifacts/8e/8ea9040eea32abd9f7d2798abbe196ef new file mode 100644 index 00000000..934259d9 Binary files /dev/null and b/clock/Library/Artifacts/8e/8ea9040eea32abd9f7d2798abbe196ef differ diff --git a/clock/Library/Artifacts/8e/8eaeee4ff94b0c6630bc8ea31cb1506e b/clock/Library/Artifacts/8e/8eaeee4ff94b0c6630bc8ea31cb1506e new file mode 100644 index 00000000..1be47290 Binary files /dev/null and b/clock/Library/Artifacts/8e/8eaeee4ff94b0c6630bc8ea31cb1506e differ diff --git a/clock/Library/Artifacts/8e/8ed049a13d5e96edec8ec6426293be51 b/clock/Library/Artifacts/8e/8ed049a13d5e96edec8ec6426293be51 new file mode 100644 index 00000000..8495e565 Binary files /dev/null and b/clock/Library/Artifacts/8e/8ed049a13d5e96edec8ec6426293be51 differ diff --git a/clock/Library/Artifacts/8e/8ed4d07861749717781610120f183919 b/clock/Library/Artifacts/8e/8ed4d07861749717781610120f183919 new file mode 100644 index 00000000..3f413fc1 Binary files /dev/null and b/clock/Library/Artifacts/8e/8ed4d07861749717781610120f183919 differ diff --git a/clock/Library/Artifacts/8f/8f06c3edb622429431900dd3e4c45992 b/clock/Library/Artifacts/8f/8f06c3edb622429431900dd3e4c45992 new file mode 100644 index 00000000..6dd926ab Binary files /dev/null and b/clock/Library/Artifacts/8f/8f06c3edb622429431900dd3e4c45992 differ diff --git a/clock/Library/Artifacts/8f/8f1162c1c69698fa967d44c71abc1613 b/clock/Library/Artifacts/8f/8f1162c1c69698fa967d44c71abc1613 new file mode 100644 index 00000000..3346ae3b Binary files /dev/null and b/clock/Library/Artifacts/8f/8f1162c1c69698fa967d44c71abc1613 differ diff --git a/clock/Library/Artifacts/8f/8f6ec7e4d83c4826e65b9d2eb6a2f179 b/clock/Library/Artifacts/8f/8f6ec7e4d83c4826e65b9d2eb6a2f179 new file mode 100644 index 00000000..57ea39b8 Binary files /dev/null and b/clock/Library/Artifacts/8f/8f6ec7e4d83c4826e65b9d2eb6a2f179 differ diff --git a/clock/Library/Artifacts/8f/8f6f2c40b96cd409337b00634fdd4c91 b/clock/Library/Artifacts/8f/8f6f2c40b96cd409337b00634fdd4c91 new file mode 100644 index 00000000..4c3b7d4b Binary files /dev/null and b/clock/Library/Artifacts/8f/8f6f2c40b96cd409337b00634fdd4c91 differ diff --git a/clock/Library/Artifacts/8f/8f7a0e25ec7f9e7234485899c0f70a26 b/clock/Library/Artifacts/8f/8f7a0e25ec7f9e7234485899c0f70a26 new file mode 100644 index 00000000..0e0a3590 Binary files /dev/null and b/clock/Library/Artifacts/8f/8f7a0e25ec7f9e7234485899c0f70a26 differ diff --git a/clock/Library/Artifacts/8f/8f85d9a539bd1fe805c2914e2658a3cb b/clock/Library/Artifacts/8f/8f85d9a539bd1fe805c2914e2658a3cb new file mode 100644 index 00000000..2eded967 Binary files /dev/null and b/clock/Library/Artifacts/8f/8f85d9a539bd1fe805c2914e2658a3cb differ diff --git a/clock/Library/Artifacts/8f/8f89d31e8f1dcb3addb7bf798cebe6d1 b/clock/Library/Artifacts/8f/8f89d31e8f1dcb3addb7bf798cebe6d1 new file mode 100644 index 00000000..9d3e49f6 Binary files /dev/null and b/clock/Library/Artifacts/8f/8f89d31e8f1dcb3addb7bf798cebe6d1 differ diff --git a/clock/Library/Artifacts/8f/8f9be8cf3253d3f9da81a740ddd84440 b/clock/Library/Artifacts/8f/8f9be8cf3253d3f9da81a740ddd84440 new file mode 100644 index 00000000..81f76e64 Binary files /dev/null and b/clock/Library/Artifacts/8f/8f9be8cf3253d3f9da81a740ddd84440 differ diff --git a/clock/Library/Artifacts/8f/8fdc8ca03445101ef72447a0e0b5ba99 b/clock/Library/Artifacts/8f/8fdc8ca03445101ef72447a0e0b5ba99 new file mode 100644 index 00000000..65051cff Binary files /dev/null and b/clock/Library/Artifacts/8f/8fdc8ca03445101ef72447a0e0b5ba99 differ diff --git a/clock/Library/Artifacts/90/9001c19e8d74561bc174cf10aa13244c b/clock/Library/Artifacts/90/9001c19e8d74561bc174cf10aa13244c new file mode 100644 index 00000000..53ca9a04 Binary files /dev/null and b/clock/Library/Artifacts/90/9001c19e8d74561bc174cf10aa13244c differ diff --git a/clock/Library/Artifacts/90/902096c4dc1bd184818acfc8acbfb506 b/clock/Library/Artifacts/90/902096c4dc1bd184818acfc8acbfb506 new file mode 100644 index 00000000..30b1ac3a Binary files /dev/null and b/clock/Library/Artifacts/90/902096c4dc1bd184818acfc8acbfb506 differ diff --git a/clock/Library/Artifacts/90/90a801c8156efe8e4b2edd94420cb329 b/clock/Library/Artifacts/90/90a801c8156efe8e4b2edd94420cb329 new file mode 100644 index 00000000..adfb5358 Binary files /dev/null and b/clock/Library/Artifacts/90/90a801c8156efe8e4b2edd94420cb329 differ diff --git a/clock/Library/Artifacts/90/90b2d2be8f32f23cade45d09698dc26f b/clock/Library/Artifacts/90/90b2d2be8f32f23cade45d09698dc26f new file mode 100644 index 00000000..47f6d973 Binary files /dev/null and b/clock/Library/Artifacts/90/90b2d2be8f32f23cade45d09698dc26f differ diff --git a/clock/Library/Artifacts/90/90e006669add24ca9754f951ccfc1327 b/clock/Library/Artifacts/90/90e006669add24ca9754f951ccfc1327 new file mode 100644 index 00000000..96f2ae9e Binary files /dev/null and b/clock/Library/Artifacts/90/90e006669add24ca9754f951ccfc1327 differ diff --git a/clock/Library/Artifacts/91/913eeca43e489be53e592ccd271097ee b/clock/Library/Artifacts/91/913eeca43e489be53e592ccd271097ee new file mode 100644 index 00000000..dc946d23 Binary files /dev/null and b/clock/Library/Artifacts/91/913eeca43e489be53e592ccd271097ee differ diff --git a/clock/Library/Artifacts/91/91443406745013cbe62f6c0ed3e29708 b/clock/Library/Artifacts/91/91443406745013cbe62f6c0ed3e29708 new file mode 100644 index 00000000..67c884ff Binary files /dev/null and b/clock/Library/Artifacts/91/91443406745013cbe62f6c0ed3e29708 differ diff --git a/clock/Library/Artifacts/91/9168a9e44a314106513ada4324fc3049 b/clock/Library/Artifacts/91/9168a9e44a314106513ada4324fc3049 new file mode 100644 index 00000000..9f0e3495 Binary files /dev/null and b/clock/Library/Artifacts/91/9168a9e44a314106513ada4324fc3049 differ diff --git a/clock/Library/Artifacts/91/91b11d978901a14647da447d317db997 b/clock/Library/Artifacts/91/91b11d978901a14647da447d317db997 new file mode 100644 index 00000000..4966aa05 Binary files /dev/null and b/clock/Library/Artifacts/91/91b11d978901a14647da447d317db997 differ diff --git a/clock/Library/Artifacts/91/91d75771f66957780a5e05521b3ba7fc b/clock/Library/Artifacts/91/91d75771f66957780a5e05521b3ba7fc new file mode 100644 index 00000000..bfad9291 Binary files /dev/null and b/clock/Library/Artifacts/91/91d75771f66957780a5e05521b3ba7fc differ diff --git a/clock/Library/Artifacts/91/91de3edf361190c37b27bca9a56d6e99 b/clock/Library/Artifacts/91/91de3edf361190c37b27bca9a56d6e99 new file mode 100644 index 00000000..75ba6938 Binary files /dev/null and b/clock/Library/Artifacts/91/91de3edf361190c37b27bca9a56d6e99 differ diff --git a/clock/Library/Artifacts/92/922a52f8957606bda3c8cc01ac790829 b/clock/Library/Artifacts/92/922a52f8957606bda3c8cc01ac790829 new file mode 100644 index 00000000..a7f6bf87 Binary files /dev/null and b/clock/Library/Artifacts/92/922a52f8957606bda3c8cc01ac790829 differ diff --git a/clock/Library/Artifacts/92/924affe10c1a15f4b64797be6d0d135e b/clock/Library/Artifacts/92/924affe10c1a15f4b64797be6d0d135e new file mode 100644 index 00000000..7c67c4af Binary files /dev/null and b/clock/Library/Artifacts/92/924affe10c1a15f4b64797be6d0d135e differ diff --git a/clock/Library/Artifacts/92/927311d80efd63419ec9d7b80fa9fb0d b/clock/Library/Artifacts/92/927311d80efd63419ec9d7b80fa9fb0d new file mode 100644 index 00000000..b477aea6 Binary files /dev/null and b/clock/Library/Artifacts/92/927311d80efd63419ec9d7b80fa9fb0d differ diff --git a/clock/Library/Artifacts/93/9316f29a029ad785b583d86a93edb2f1 b/clock/Library/Artifacts/93/9316f29a029ad785b583d86a93edb2f1 new file mode 100644 index 00000000..85a337c9 Binary files /dev/null and b/clock/Library/Artifacts/93/9316f29a029ad785b583d86a93edb2f1 differ diff --git a/clock/Library/Artifacts/93/931adf5b6a5fa8ce8dbbebcadc4d491f b/clock/Library/Artifacts/93/931adf5b6a5fa8ce8dbbebcadc4d491f new file mode 100644 index 00000000..040eb3cd Binary files /dev/null and b/clock/Library/Artifacts/93/931adf5b6a5fa8ce8dbbebcadc4d491f differ diff --git a/clock/Library/Artifacts/93/9328b4cf18622b9ec19bd9da273118c2 b/clock/Library/Artifacts/93/9328b4cf18622b9ec19bd9da273118c2 new file mode 100644 index 00000000..eb8037d5 Binary files /dev/null and b/clock/Library/Artifacts/93/9328b4cf18622b9ec19bd9da273118c2 differ diff --git a/clock/Library/Artifacts/93/932e760195be1e29952b74e977f84c48 b/clock/Library/Artifacts/93/932e760195be1e29952b74e977f84c48 new file mode 100644 index 00000000..6132453d Binary files /dev/null and b/clock/Library/Artifacts/93/932e760195be1e29952b74e977f84c48 differ diff --git a/clock/Library/Artifacts/93/937a7dd7e24e487e7d7310745988250a b/clock/Library/Artifacts/93/937a7dd7e24e487e7d7310745988250a new file mode 100644 index 00000000..298c51e2 Binary files /dev/null and b/clock/Library/Artifacts/93/937a7dd7e24e487e7d7310745988250a differ diff --git a/clock/Library/Artifacts/93/93ab5220d735924b6b4ebf46d73e9f2f b/clock/Library/Artifacts/93/93ab5220d735924b6b4ebf46d73e9f2f new file mode 100644 index 00000000..d6c8b1f4 Binary files /dev/null and b/clock/Library/Artifacts/93/93ab5220d735924b6b4ebf46d73e9f2f differ diff --git a/clock/Library/Artifacts/93/93fc3012d797b749abde15f373285520 b/clock/Library/Artifacts/93/93fc3012d797b749abde15f373285520 new file mode 100644 index 00000000..6b71348f Binary files /dev/null and b/clock/Library/Artifacts/93/93fc3012d797b749abde15f373285520 differ diff --git a/clock/Library/Artifacts/94/941cefc21987c872d48345e8f4d0283f b/clock/Library/Artifacts/94/941cefc21987c872d48345e8f4d0283f new file mode 100644 index 00000000..a0662794 Binary files /dev/null and b/clock/Library/Artifacts/94/941cefc21987c872d48345e8f4d0283f differ diff --git a/clock/Library/Artifacts/94/949a087c4f188e668737df72122331c6 b/clock/Library/Artifacts/94/949a087c4f188e668737df72122331c6 new file mode 100644 index 00000000..65d53128 Binary files /dev/null and b/clock/Library/Artifacts/94/949a087c4f188e668737df72122331c6 differ diff --git a/clock/Library/Artifacts/95/9506d3525d1f82fc42bc9906657352f3 b/clock/Library/Artifacts/95/9506d3525d1f82fc42bc9906657352f3 new file mode 100644 index 00000000..0477aafd Binary files /dev/null and b/clock/Library/Artifacts/95/9506d3525d1f82fc42bc9906657352f3 differ diff --git a/clock/Library/Artifacts/95/951aa0839c8db8a9ae32042f12a3f249 b/clock/Library/Artifacts/95/951aa0839c8db8a9ae32042f12a3f249 new file mode 100644 index 00000000..362481fe Binary files /dev/null and b/clock/Library/Artifacts/95/951aa0839c8db8a9ae32042f12a3f249 differ diff --git a/clock/Library/Artifacts/95/951d3631ea362a25f53f9c7ee7c6f7fe b/clock/Library/Artifacts/95/951d3631ea362a25f53f9c7ee7c6f7fe new file mode 100644 index 00000000..11061b86 Binary files /dev/null and b/clock/Library/Artifacts/95/951d3631ea362a25f53f9c7ee7c6f7fe differ diff --git a/clock/Library/Artifacts/95/957eb55b3981e183dcf4c68cc07876c4 b/clock/Library/Artifacts/95/957eb55b3981e183dcf4c68cc07876c4 new file mode 100644 index 00000000..02087c0d Binary files /dev/null and b/clock/Library/Artifacts/95/957eb55b3981e183dcf4c68cc07876c4 differ diff --git a/clock/Library/Artifacts/95/95878c4c2c3aa2eeb07e6d298c624607 b/clock/Library/Artifacts/95/95878c4c2c3aa2eeb07e6d298c624607 new file mode 100644 index 00000000..dcb79e6a Binary files /dev/null and b/clock/Library/Artifacts/95/95878c4c2c3aa2eeb07e6d298c624607 differ diff --git a/clock/Library/Artifacts/95/95f88226fc4185ff98b509b3809c9877 b/clock/Library/Artifacts/95/95f88226fc4185ff98b509b3809c9877 new file mode 100644 index 00000000..f8ca6187 Binary files /dev/null and b/clock/Library/Artifacts/95/95f88226fc4185ff98b509b3809c9877 differ diff --git a/clock/Library/Artifacts/96/9655d777f7d21df990f39f992738b623 b/clock/Library/Artifacts/96/9655d777f7d21df990f39f992738b623 new file mode 100644 index 00000000..a1b623f3 Binary files /dev/null and b/clock/Library/Artifacts/96/9655d777f7d21df990f39f992738b623 differ diff --git a/clock/Library/Artifacts/96/966684d60169c2cee5097e4d356a5400 b/clock/Library/Artifacts/96/966684d60169c2cee5097e4d356a5400 new file mode 100644 index 00000000..a130a1a9 Binary files /dev/null and b/clock/Library/Artifacts/96/966684d60169c2cee5097e4d356a5400 differ diff --git a/clock/Library/Artifacts/96/96c1a370285fff37eae4f50188c2404c b/clock/Library/Artifacts/96/96c1a370285fff37eae4f50188c2404c new file mode 100644 index 00000000..dbbc1948 Binary files /dev/null and b/clock/Library/Artifacts/96/96c1a370285fff37eae4f50188c2404c differ diff --git a/clock/Library/Artifacts/96/96d9c196f2fb0f9493e4c8bf40f31dde b/clock/Library/Artifacts/96/96d9c196f2fb0f9493e4c8bf40f31dde new file mode 100644 index 00000000..67edaabe Binary files /dev/null and b/clock/Library/Artifacts/96/96d9c196f2fb0f9493e4c8bf40f31dde differ diff --git a/clock/Library/Artifacts/96/96ec37e4579b8bbcf986e87a9cc806c6 b/clock/Library/Artifacts/96/96ec37e4579b8bbcf986e87a9cc806c6 new file mode 100644 index 00000000..6d2873e2 Binary files /dev/null and b/clock/Library/Artifacts/96/96ec37e4579b8bbcf986e87a9cc806c6 differ diff --git a/clock/Library/Artifacts/97/9701829542a88ccc2c1a319917764f87 b/clock/Library/Artifacts/97/9701829542a88ccc2c1a319917764f87 new file mode 100644 index 00000000..8d9c0d65 Binary files /dev/null and b/clock/Library/Artifacts/97/9701829542a88ccc2c1a319917764f87 differ diff --git a/clock/Library/Artifacts/97/9772630751f8dfec8a2ddcc6f3bf038e b/clock/Library/Artifacts/97/9772630751f8dfec8a2ddcc6f3bf038e new file mode 100644 index 00000000..8aa9b143 Binary files /dev/null and b/clock/Library/Artifacts/97/9772630751f8dfec8a2ddcc6f3bf038e differ diff --git a/clock/Library/Artifacts/97/978b284383d679a3cc2f6107cacf3f4c b/clock/Library/Artifacts/97/978b284383d679a3cc2f6107cacf3f4c new file mode 100644 index 00000000..84fbc45e Binary files /dev/null and b/clock/Library/Artifacts/97/978b284383d679a3cc2f6107cacf3f4c differ diff --git a/clock/Library/Artifacts/97/97dca3d9bb3442dacd4a825142830210 b/clock/Library/Artifacts/97/97dca3d9bb3442dacd4a825142830210 new file mode 100644 index 00000000..ed044eaf Binary files /dev/null and b/clock/Library/Artifacts/97/97dca3d9bb3442dacd4a825142830210 differ diff --git a/clock/Library/Artifacts/98/9830eeae0a0e0f1424e18f1e685b7fcf b/clock/Library/Artifacts/98/9830eeae0a0e0f1424e18f1e685b7fcf new file mode 100644 index 00000000..bcfe292e Binary files /dev/null and b/clock/Library/Artifacts/98/9830eeae0a0e0f1424e18f1e685b7fcf differ diff --git a/clock/Library/Artifacts/98/985fdb00bb96060d44c80864d1e95da8 b/clock/Library/Artifacts/98/985fdb00bb96060d44c80864d1e95da8 new file mode 100644 index 00000000..d1d510aa Binary files /dev/null and b/clock/Library/Artifacts/98/985fdb00bb96060d44c80864d1e95da8 differ diff --git a/clock/Library/Artifacts/98/9877b09f0f698bd11da3bb573a337725 b/clock/Library/Artifacts/98/9877b09f0f698bd11da3bb573a337725 new file mode 100644 index 00000000..d8076fbd Binary files /dev/null and b/clock/Library/Artifacts/98/9877b09f0f698bd11da3bb573a337725 differ diff --git a/clock/Library/Artifacts/98/989e4560e28e675261877118f23e5af0 b/clock/Library/Artifacts/98/989e4560e28e675261877118f23e5af0 new file mode 100644 index 00000000..2514e9f5 Binary files /dev/null and b/clock/Library/Artifacts/98/989e4560e28e675261877118f23e5af0 differ diff --git a/clock/Library/Artifacts/98/98cd9a4f40aa9c4e1095898ff374d125 b/clock/Library/Artifacts/98/98cd9a4f40aa9c4e1095898ff374d125 new file mode 100644 index 00000000..7fd364d6 Binary files /dev/null and b/clock/Library/Artifacts/98/98cd9a4f40aa9c4e1095898ff374d125 differ diff --git a/clock/Library/Artifacts/98/98f2924b4063e98cf6c48427d29937f5 b/clock/Library/Artifacts/98/98f2924b4063e98cf6c48427d29937f5 new file mode 100644 index 00000000..28baf8a6 Binary files /dev/null and b/clock/Library/Artifacts/98/98f2924b4063e98cf6c48427d29937f5 differ diff --git a/clock/Library/Artifacts/99/990e646dd11facc9b7a4f2a7abe28865 b/clock/Library/Artifacts/99/990e646dd11facc9b7a4f2a7abe28865 new file mode 100644 index 00000000..e5811d03 Binary files /dev/null and b/clock/Library/Artifacts/99/990e646dd11facc9b7a4f2a7abe28865 differ diff --git a/clock/Library/Artifacts/99/99245257a042b37cf992fa69d0fa8d00 b/clock/Library/Artifacts/99/99245257a042b37cf992fa69d0fa8d00 new file mode 100644 index 00000000..cebf23ba Binary files /dev/null and b/clock/Library/Artifacts/99/99245257a042b37cf992fa69d0fa8d00 differ diff --git a/clock/Library/Artifacts/99/999cacb2f6d0854d22fadc90a50cafd6 b/clock/Library/Artifacts/99/999cacb2f6d0854d22fadc90a50cafd6 new file mode 100644 index 00000000..50551e02 Binary files /dev/null and b/clock/Library/Artifacts/99/999cacb2f6d0854d22fadc90a50cafd6 differ diff --git a/clock/Library/Artifacts/99/99d7d6b8c9787ea2267de27ee2f2d314 b/clock/Library/Artifacts/99/99d7d6b8c9787ea2267de27ee2f2d314 new file mode 100644 index 00000000..9e35fce0 Binary files /dev/null and b/clock/Library/Artifacts/99/99d7d6b8c9787ea2267de27ee2f2d314 differ diff --git a/clock/Library/Artifacts/99/99f8d778cfc11ebe31eadb1f242fc8cf b/clock/Library/Artifacts/99/99f8d778cfc11ebe31eadb1f242fc8cf new file mode 100644 index 00000000..1fa7678e Binary files /dev/null and b/clock/Library/Artifacts/99/99f8d778cfc11ebe31eadb1f242fc8cf differ diff --git a/clock/Library/Artifacts/9a/9a000842ade745d164f6a7d44237383b b/clock/Library/Artifacts/9a/9a000842ade745d164f6a7d44237383b new file mode 100644 index 00000000..feeca842 Binary files /dev/null and b/clock/Library/Artifacts/9a/9a000842ade745d164f6a7d44237383b differ diff --git a/clock/Library/Artifacts/9a/9a1bab4ce58ca8af41670ba985cd88bf b/clock/Library/Artifacts/9a/9a1bab4ce58ca8af41670ba985cd88bf new file mode 100644 index 00000000..ccf43fc3 Binary files /dev/null and b/clock/Library/Artifacts/9a/9a1bab4ce58ca8af41670ba985cd88bf differ diff --git a/clock/Library/Artifacts/9a/9aa74799c54b6c5cba6edf7f063f1c7f b/clock/Library/Artifacts/9a/9aa74799c54b6c5cba6edf7f063f1c7f new file mode 100644 index 00000000..7e4b4aee Binary files /dev/null and b/clock/Library/Artifacts/9a/9aa74799c54b6c5cba6edf7f063f1c7f differ diff --git a/clock/Library/Artifacts/9a/9ae451c273258a94141dd171fcace677 b/clock/Library/Artifacts/9a/9ae451c273258a94141dd171fcace677 new file mode 100644 index 00000000..2a5fccde Binary files /dev/null and b/clock/Library/Artifacts/9a/9ae451c273258a94141dd171fcace677 differ diff --git a/clock/Library/Artifacts/9a/9ae477cd90913f228c8594114c3d4a6a b/clock/Library/Artifacts/9a/9ae477cd90913f228c8594114c3d4a6a new file mode 100644 index 00000000..f0439f80 Binary files /dev/null and b/clock/Library/Artifacts/9a/9ae477cd90913f228c8594114c3d4a6a differ diff --git a/clock/Library/Artifacts/9b/9b53f960e79c80bf3500c545ee4e1a8e b/clock/Library/Artifacts/9b/9b53f960e79c80bf3500c545ee4e1a8e new file mode 100644 index 00000000..0dadc999 Binary files /dev/null and b/clock/Library/Artifacts/9b/9b53f960e79c80bf3500c545ee4e1a8e differ diff --git a/clock/Library/Artifacts/9b/9b86cdc3dcf63bf9d4fc5ac666b88d83 b/clock/Library/Artifacts/9b/9b86cdc3dcf63bf9d4fc5ac666b88d83 new file mode 100644 index 00000000..d0fc594c Binary files /dev/null and b/clock/Library/Artifacts/9b/9b86cdc3dcf63bf9d4fc5ac666b88d83 differ diff --git a/clock/Library/Artifacts/9b/9bb61e4064cce20fff242d8719ec225f b/clock/Library/Artifacts/9b/9bb61e4064cce20fff242d8719ec225f new file mode 100644 index 00000000..9353a9da Binary files /dev/null and b/clock/Library/Artifacts/9b/9bb61e4064cce20fff242d8719ec225f differ diff --git a/clock/Library/Artifacts/9c/9c4a7df6dbbc3d62bf879ed1acfbfdce b/clock/Library/Artifacts/9c/9c4a7df6dbbc3d62bf879ed1acfbfdce new file mode 100644 index 00000000..bd835769 Binary files /dev/null and b/clock/Library/Artifacts/9c/9c4a7df6dbbc3d62bf879ed1acfbfdce differ diff --git a/clock/Library/Artifacts/9c/9c5b17de2affcef01ecedac2e2b08e02 b/clock/Library/Artifacts/9c/9c5b17de2affcef01ecedac2e2b08e02 new file mode 100644 index 00000000..52397355 Binary files /dev/null and b/clock/Library/Artifacts/9c/9c5b17de2affcef01ecedac2e2b08e02 differ diff --git a/clock/Library/Artifacts/9c/9c9f84d493c412ccd7f753ed29b2e4b9 b/clock/Library/Artifacts/9c/9c9f84d493c412ccd7f753ed29b2e4b9 new file mode 100644 index 00000000..07874f82 Binary files /dev/null and b/clock/Library/Artifacts/9c/9c9f84d493c412ccd7f753ed29b2e4b9 differ diff --git a/clock/Library/Artifacts/9c/9cc14f696c65724edbe7ff5daae120b1 b/clock/Library/Artifacts/9c/9cc14f696c65724edbe7ff5daae120b1 new file mode 100644 index 00000000..b2f9702b Binary files /dev/null and b/clock/Library/Artifacts/9c/9cc14f696c65724edbe7ff5daae120b1 differ diff --git a/clock/Library/Artifacts/9d/9d00d4b9c91eab0ac1889551d228e687 b/clock/Library/Artifacts/9d/9d00d4b9c91eab0ac1889551d228e687 new file mode 100644 index 00000000..9060053d Binary files /dev/null and b/clock/Library/Artifacts/9d/9d00d4b9c91eab0ac1889551d228e687 differ diff --git a/clock/Library/Artifacts/9d/9d9605f508939522e621530ffaddae6e b/clock/Library/Artifacts/9d/9d9605f508939522e621530ffaddae6e new file mode 100644 index 00000000..5dad2e50 Binary files /dev/null and b/clock/Library/Artifacts/9d/9d9605f508939522e621530ffaddae6e differ diff --git a/clock/Library/Artifacts/9d/9dca7ebadd566ab4efb4830964b94fb4 b/clock/Library/Artifacts/9d/9dca7ebadd566ab4efb4830964b94fb4 new file mode 100644 index 00000000..1d64a493 Binary files /dev/null and b/clock/Library/Artifacts/9d/9dca7ebadd566ab4efb4830964b94fb4 differ diff --git a/clock/Library/Artifacts/9d/9de22f3b0c61608da36b871d5a42da02 b/clock/Library/Artifacts/9d/9de22f3b0c61608da36b871d5a42da02 new file mode 100644 index 00000000..c248d3b1 Binary files /dev/null and b/clock/Library/Artifacts/9d/9de22f3b0c61608da36b871d5a42da02 differ diff --git a/clock/Library/Artifacts/9d/9df7213b973dec60c03cd58c44b5dc9f b/clock/Library/Artifacts/9d/9df7213b973dec60c03cd58c44b5dc9f new file mode 100644 index 00000000..7da3b82f Binary files /dev/null and b/clock/Library/Artifacts/9d/9df7213b973dec60c03cd58c44b5dc9f differ diff --git a/clock/Library/Artifacts/9e/9e48e56f29ece089798132c5d1e48d69 b/clock/Library/Artifacts/9e/9e48e56f29ece089798132c5d1e48d69 new file mode 100644 index 00000000..67d06fd8 Binary files /dev/null and b/clock/Library/Artifacts/9e/9e48e56f29ece089798132c5d1e48d69 differ diff --git a/clock/Library/Artifacts/9e/9e872397ecc4c90474092af10f4b8631 b/clock/Library/Artifacts/9e/9e872397ecc4c90474092af10f4b8631 new file mode 100644 index 00000000..f29b9f41 Binary files /dev/null and b/clock/Library/Artifacts/9e/9e872397ecc4c90474092af10f4b8631 differ diff --git a/clock/Library/Artifacts/9e/9e9b19e0dc7b697eaa2e966231913608 b/clock/Library/Artifacts/9e/9e9b19e0dc7b697eaa2e966231913608 new file mode 100644 index 00000000..46f07db2 Binary files /dev/null and b/clock/Library/Artifacts/9e/9e9b19e0dc7b697eaa2e966231913608 differ diff --git a/clock/Library/Artifacts/9e/9ea12dbb089eb63d726b9ef4e29d66ae b/clock/Library/Artifacts/9e/9ea12dbb089eb63d726b9ef4e29d66ae new file mode 100644 index 00000000..88ce6bcc Binary files /dev/null and b/clock/Library/Artifacts/9e/9ea12dbb089eb63d726b9ef4e29d66ae differ diff --git a/clock/Library/Artifacts/9e/9eaf04606b6d06625702b94ddaeb1cb9 b/clock/Library/Artifacts/9e/9eaf04606b6d06625702b94ddaeb1cb9 new file mode 100644 index 00000000..cad2e5a2 Binary files /dev/null and b/clock/Library/Artifacts/9e/9eaf04606b6d06625702b94ddaeb1cb9 differ diff --git a/clock/Library/Artifacts/9e/9edaaa017cce5629d9b2337955759f14 b/clock/Library/Artifacts/9e/9edaaa017cce5629d9b2337955759f14 new file mode 100644 index 00000000..e96ace1c Binary files /dev/null and b/clock/Library/Artifacts/9e/9edaaa017cce5629d9b2337955759f14 differ diff --git a/clock/Library/Artifacts/9f/9f163d8b92793919e0fd02f31d750291 b/clock/Library/Artifacts/9f/9f163d8b92793919e0fd02f31d750291 new file mode 100644 index 00000000..bb73e6f9 Binary files /dev/null and b/clock/Library/Artifacts/9f/9f163d8b92793919e0fd02f31d750291 differ diff --git a/clock/Library/Artifacts/9f/9f250396c6b26457294992da6b46795d b/clock/Library/Artifacts/9f/9f250396c6b26457294992da6b46795d new file mode 100644 index 00000000..257b4007 Binary files /dev/null and b/clock/Library/Artifacts/9f/9f250396c6b26457294992da6b46795d differ diff --git a/clock/Library/Artifacts/9f/9f26decad39c2fe30376fcf0b082aa26 b/clock/Library/Artifacts/9f/9f26decad39c2fe30376fcf0b082aa26 new file mode 100644 index 00000000..854bb9a1 Binary files /dev/null and b/clock/Library/Artifacts/9f/9f26decad39c2fe30376fcf0b082aa26 differ diff --git a/clock/Library/Artifacts/9f/9fb725dc431579409c80e77bd220f758 b/clock/Library/Artifacts/9f/9fb725dc431579409c80e77bd220f758 new file mode 100644 index 00000000..78747e68 Binary files /dev/null and b/clock/Library/Artifacts/9f/9fb725dc431579409c80e77bd220f758 differ diff --git a/clock/Library/Artifacts/9f/9fd9c601bbe8007c431f686009f560c5 b/clock/Library/Artifacts/9f/9fd9c601bbe8007c431f686009f560c5 new file mode 100644 index 00000000..d080eebb Binary files /dev/null and b/clock/Library/Artifacts/9f/9fd9c601bbe8007c431f686009f560c5 differ diff --git a/clock/Library/Artifacts/a0/a02002ccdb221224f3cd6e578787fed2 b/clock/Library/Artifacts/a0/a02002ccdb221224f3cd6e578787fed2 new file mode 100644 index 00000000..ab461c60 Binary files /dev/null and b/clock/Library/Artifacts/a0/a02002ccdb221224f3cd6e578787fed2 differ diff --git a/clock/Library/Artifacts/a0/a02104b5cfa45a3c4a5d652c126994fc b/clock/Library/Artifacts/a0/a02104b5cfa45a3c4a5d652c126994fc new file mode 100644 index 00000000..fc863acd Binary files /dev/null and b/clock/Library/Artifacts/a0/a02104b5cfa45a3c4a5d652c126994fc differ diff --git a/clock/Library/Artifacts/a0/a03f4c8bf23ada20894d41312957cd77 b/clock/Library/Artifacts/a0/a03f4c8bf23ada20894d41312957cd77 new file mode 100644 index 00000000..05cd9b01 Binary files /dev/null and b/clock/Library/Artifacts/a0/a03f4c8bf23ada20894d41312957cd77 differ diff --git a/clock/Library/Artifacts/a0/a055a1e3667d97d0da344d7bd76081aa b/clock/Library/Artifacts/a0/a055a1e3667d97d0da344d7bd76081aa new file mode 100644 index 00000000..d42e38f8 Binary files /dev/null and b/clock/Library/Artifacts/a0/a055a1e3667d97d0da344d7bd76081aa differ diff --git a/clock/Library/Artifacts/a0/a059af6fd50870a958c4fe256a9eee7d b/clock/Library/Artifacts/a0/a059af6fd50870a958c4fe256a9eee7d new file mode 100644 index 00000000..b4e5c361 Binary files /dev/null and b/clock/Library/Artifacts/a0/a059af6fd50870a958c4fe256a9eee7d differ diff --git a/clock/Library/Artifacts/a0/a0d592eb920c14a067e276ef6bb42334 b/clock/Library/Artifacts/a0/a0d592eb920c14a067e276ef6bb42334 new file mode 100644 index 00000000..084d1499 Binary files /dev/null and b/clock/Library/Artifacts/a0/a0d592eb920c14a067e276ef6bb42334 differ diff --git a/clock/Library/Artifacts/a0/a0de831d2731b4ff7aa9a0d4e01fbb3d b/clock/Library/Artifacts/a0/a0de831d2731b4ff7aa9a0d4e01fbb3d new file mode 100644 index 00000000..35f22ac1 Binary files /dev/null and b/clock/Library/Artifacts/a0/a0de831d2731b4ff7aa9a0d4e01fbb3d differ diff --git a/clock/Library/Artifacts/a1/a158e007183ce99a95736066ddccc8e8 b/clock/Library/Artifacts/a1/a158e007183ce99a95736066ddccc8e8 new file mode 100644 index 00000000..d9f75bf1 Binary files /dev/null and b/clock/Library/Artifacts/a1/a158e007183ce99a95736066ddccc8e8 differ diff --git a/clock/Library/Artifacts/a1/a1781c2f87bd490b70b75c6e01da62b9 b/clock/Library/Artifacts/a1/a1781c2f87bd490b70b75c6e01da62b9 new file mode 100644 index 00000000..f92cbc45 Binary files /dev/null and b/clock/Library/Artifacts/a1/a1781c2f87bd490b70b75c6e01da62b9 differ diff --git a/clock/Library/Artifacts/a1/a1dc18178e9a2e0230b7df4871944b98 b/clock/Library/Artifacts/a1/a1dc18178e9a2e0230b7df4871944b98 new file mode 100644 index 00000000..28ae7e86 Binary files /dev/null and b/clock/Library/Artifacts/a1/a1dc18178e9a2e0230b7df4871944b98 differ diff --git a/clock/Library/Artifacts/a1/a1e7dc24ed59d8c99285661115d3f738 b/clock/Library/Artifacts/a1/a1e7dc24ed59d8c99285661115d3f738 new file mode 100644 index 00000000..c61aca79 Binary files /dev/null and b/clock/Library/Artifacts/a1/a1e7dc24ed59d8c99285661115d3f738 differ diff --git a/clock/Library/Artifacts/a2/a23e91ca768ccaea292ecd85388feae7 b/clock/Library/Artifacts/a2/a23e91ca768ccaea292ecd85388feae7 new file mode 100644 index 00000000..a7cca5a0 Binary files /dev/null and b/clock/Library/Artifacts/a2/a23e91ca768ccaea292ecd85388feae7 differ diff --git a/clock/Library/Artifacts/a2/a24aee6a34af41cab397c2f14e3d5de3 b/clock/Library/Artifacts/a2/a24aee6a34af41cab397c2f14e3d5de3 new file mode 100644 index 00000000..f18e2fe2 Binary files /dev/null and b/clock/Library/Artifacts/a2/a24aee6a34af41cab397c2f14e3d5de3 differ diff --git a/clock/Library/Artifacts/a2/a256e18f9f9ae073b6d5e6b307b841b0 b/clock/Library/Artifacts/a2/a256e18f9f9ae073b6d5e6b307b841b0 new file mode 100644 index 00000000..6376d7f5 Binary files /dev/null and b/clock/Library/Artifacts/a2/a256e18f9f9ae073b6d5e6b307b841b0 differ diff --git a/clock/Library/Artifacts/a2/a2735d509cf3e9cd853b32f9fd62e5f8 b/clock/Library/Artifacts/a2/a2735d509cf3e9cd853b32f9fd62e5f8 new file mode 100644 index 00000000..0dac17fd Binary files /dev/null and b/clock/Library/Artifacts/a2/a2735d509cf3e9cd853b32f9fd62e5f8 differ diff --git a/clock/Library/Artifacts/a2/a2a93810122f47ba931e2a824f41d34f b/clock/Library/Artifacts/a2/a2a93810122f47ba931e2a824f41d34f new file mode 100644 index 00000000..f2a221f4 Binary files /dev/null and b/clock/Library/Artifacts/a2/a2a93810122f47ba931e2a824f41d34f differ diff --git a/clock/Library/Artifacts/a2/a2d74b58a77383dc068a26576cd7f071 b/clock/Library/Artifacts/a2/a2d74b58a77383dc068a26576cd7f071 new file mode 100644 index 00000000..514da9bc Binary files /dev/null and b/clock/Library/Artifacts/a2/a2d74b58a77383dc068a26576cd7f071 differ diff --git a/clock/Library/Artifacts/a3/a317acce962c8b6dba153a9f34d65fdb b/clock/Library/Artifacts/a3/a317acce962c8b6dba153a9f34d65fdb new file mode 100644 index 00000000..68ebdbe7 Binary files /dev/null and b/clock/Library/Artifacts/a3/a317acce962c8b6dba153a9f34d65fdb differ diff --git a/clock/Library/Artifacts/a3/a333d4246dbfb34ec4ef4bcaf928d4cd b/clock/Library/Artifacts/a3/a333d4246dbfb34ec4ef4bcaf928d4cd new file mode 100644 index 00000000..95eac653 Binary files /dev/null and b/clock/Library/Artifacts/a3/a333d4246dbfb34ec4ef4bcaf928d4cd differ diff --git a/clock/Library/Artifacts/a3/a3479aca78afee95d59bba7696828677 b/clock/Library/Artifacts/a3/a3479aca78afee95d59bba7696828677 new file mode 100644 index 00000000..7034159b Binary files /dev/null and b/clock/Library/Artifacts/a3/a3479aca78afee95d59bba7696828677 differ diff --git a/clock/Library/Artifacts/a3/a3b464fe2cc64432e9c3e572acbdc673 b/clock/Library/Artifacts/a3/a3b464fe2cc64432e9c3e572acbdc673 new file mode 100644 index 00000000..8843032b Binary files /dev/null and b/clock/Library/Artifacts/a3/a3b464fe2cc64432e9c3e572acbdc673 differ diff --git a/clock/Library/Artifacts/a3/a3b7d6f931e09d5355cb5eac74acb263 b/clock/Library/Artifacts/a3/a3b7d6f931e09d5355cb5eac74acb263 new file mode 100644 index 00000000..37666c28 Binary files /dev/null and b/clock/Library/Artifacts/a3/a3b7d6f931e09d5355cb5eac74acb263 differ diff --git a/clock/Library/Artifacts/a3/a3c88e857239439c46c03110af1360bb b/clock/Library/Artifacts/a3/a3c88e857239439c46c03110af1360bb new file mode 100644 index 00000000..beff5bb5 Binary files /dev/null and b/clock/Library/Artifacts/a3/a3c88e857239439c46c03110af1360bb differ diff --git a/clock/Library/Artifacts/a3/a3eba622304eacd1589b0e2e78f814a2 b/clock/Library/Artifacts/a3/a3eba622304eacd1589b0e2e78f814a2 new file mode 100644 index 00000000..620d19d9 Binary files /dev/null and b/clock/Library/Artifacts/a3/a3eba622304eacd1589b0e2e78f814a2 differ diff --git a/clock/Library/Artifacts/a4/a44a4bcbc6341cc66450ccb9bc522296 b/clock/Library/Artifacts/a4/a44a4bcbc6341cc66450ccb9bc522296 new file mode 100644 index 00000000..b635a08d Binary files /dev/null and b/clock/Library/Artifacts/a4/a44a4bcbc6341cc66450ccb9bc522296 differ diff --git a/clock/Library/Artifacts/a5/a52c2068d6390a3c3707b5a50c53b931 b/clock/Library/Artifacts/a5/a52c2068d6390a3c3707b5a50c53b931 new file mode 100644 index 00000000..54ef3d5e Binary files /dev/null and b/clock/Library/Artifacts/a5/a52c2068d6390a3c3707b5a50c53b931 differ diff --git a/clock/Library/Artifacts/a5/a54011037a33c70f649aef41c1623436 b/clock/Library/Artifacts/a5/a54011037a33c70f649aef41c1623436 new file mode 100644 index 00000000..720a5f4c Binary files /dev/null and b/clock/Library/Artifacts/a5/a54011037a33c70f649aef41c1623436 differ diff --git a/clock/Library/Artifacts/a5/a566825548cd5cb9cc5f5be9ff07a79f b/clock/Library/Artifacts/a5/a566825548cd5cb9cc5f5be9ff07a79f new file mode 100644 index 00000000..dee4b09d Binary files /dev/null and b/clock/Library/Artifacts/a5/a566825548cd5cb9cc5f5be9ff07a79f differ diff --git a/clock/Library/Artifacts/a6/a6164b18e187e4710a7ff41414913567 b/clock/Library/Artifacts/a6/a6164b18e187e4710a7ff41414913567 new file mode 100644 index 00000000..3e27bd32 Binary files /dev/null and b/clock/Library/Artifacts/a6/a6164b18e187e4710a7ff41414913567 differ diff --git a/clock/Library/Artifacts/a6/a69aa3f1b432aa4a0ea02ec425b53c8a b/clock/Library/Artifacts/a6/a69aa3f1b432aa4a0ea02ec425b53c8a new file mode 100644 index 00000000..42c37a4e Binary files /dev/null and b/clock/Library/Artifacts/a6/a69aa3f1b432aa4a0ea02ec425b53c8a differ diff --git a/clock/Library/Artifacts/a6/a69bc184bed6bf694f502227ca69b3f9 b/clock/Library/Artifacts/a6/a69bc184bed6bf694f502227ca69b3f9 new file mode 100644 index 00000000..27553307 Binary files /dev/null and b/clock/Library/Artifacts/a6/a69bc184bed6bf694f502227ca69b3f9 differ diff --git a/clock/Library/Artifacts/a6/a6f901a54da7685e7f1bf013b4ee5243 b/clock/Library/Artifacts/a6/a6f901a54da7685e7f1bf013b4ee5243 new file mode 100644 index 00000000..da456c05 Binary files /dev/null and b/clock/Library/Artifacts/a6/a6f901a54da7685e7f1bf013b4ee5243 differ diff --git a/clock/Library/Artifacts/a7/a7106456c6eec96fbd8b1e9d903e603b b/clock/Library/Artifacts/a7/a7106456c6eec96fbd8b1e9d903e603b new file mode 100644 index 00000000..198cc8c8 Binary files /dev/null and b/clock/Library/Artifacts/a7/a7106456c6eec96fbd8b1e9d903e603b differ diff --git a/clock/Library/Artifacts/a7/a73257752b3bb8d7ce052b37b4fac1d3 b/clock/Library/Artifacts/a7/a73257752b3bb8d7ce052b37b4fac1d3 new file mode 100644 index 00000000..93e3e484 Binary files /dev/null and b/clock/Library/Artifacts/a7/a73257752b3bb8d7ce052b37b4fac1d3 differ diff --git a/clock/Library/Artifacts/a7/a76d675763beb87b43397bce5b3d1cb0 b/clock/Library/Artifacts/a7/a76d675763beb87b43397bce5b3d1cb0 new file mode 100644 index 00000000..d8044b8e Binary files /dev/null and b/clock/Library/Artifacts/a7/a76d675763beb87b43397bce5b3d1cb0 differ diff --git a/clock/Library/Artifacts/a7/a78f7fc03c887bfb26683f91e11d729a b/clock/Library/Artifacts/a7/a78f7fc03c887bfb26683f91e11d729a new file mode 100644 index 00000000..04a054e4 Binary files /dev/null and b/clock/Library/Artifacts/a7/a78f7fc03c887bfb26683f91e11d729a differ diff --git a/clock/Library/Artifacts/a7/a7a3308d16e89ec0c1e41fd3bae698f2 b/clock/Library/Artifacts/a7/a7a3308d16e89ec0c1e41fd3bae698f2 new file mode 100644 index 00000000..8f1fa3da Binary files /dev/null and b/clock/Library/Artifacts/a7/a7a3308d16e89ec0c1e41fd3bae698f2 differ diff --git a/clock/Library/Artifacts/a7/a7b34c91a8a78c037ebdb06cf5d01c96 b/clock/Library/Artifacts/a7/a7b34c91a8a78c037ebdb06cf5d01c96 new file mode 100644 index 00000000..864d7aae Binary files /dev/null and b/clock/Library/Artifacts/a7/a7b34c91a8a78c037ebdb06cf5d01c96 differ diff --git a/clock/Library/Artifacts/a7/a7b5b8492aff69aba02ee436416d1fb7 b/clock/Library/Artifacts/a7/a7b5b8492aff69aba02ee436416d1fb7 new file mode 100644 index 00000000..692cce0c Binary files /dev/null and b/clock/Library/Artifacts/a7/a7b5b8492aff69aba02ee436416d1fb7 differ diff --git a/clock/Library/Artifacts/a7/a7bb6da55a09854383ac13ea3ef2d334 b/clock/Library/Artifacts/a7/a7bb6da55a09854383ac13ea3ef2d334 new file mode 100644 index 00000000..8d53a966 Binary files /dev/null and b/clock/Library/Artifacts/a7/a7bb6da55a09854383ac13ea3ef2d334 differ diff --git a/clock/Library/Artifacts/a7/a7edc2c26112553198ecb5cdf56dd6fc b/clock/Library/Artifacts/a7/a7edc2c26112553198ecb5cdf56dd6fc new file mode 100644 index 00000000..26257670 Binary files /dev/null and b/clock/Library/Artifacts/a7/a7edc2c26112553198ecb5cdf56dd6fc differ diff --git a/clock/Library/Artifacts/a8/a81b0a8b3265058bea1c9a09066552fc b/clock/Library/Artifacts/a8/a81b0a8b3265058bea1c9a09066552fc new file mode 100644 index 00000000..7b7dd47f Binary files /dev/null and b/clock/Library/Artifacts/a8/a81b0a8b3265058bea1c9a09066552fc differ diff --git a/clock/Library/Artifacts/a8/a84e23c667fbd67f33440421196770ae b/clock/Library/Artifacts/a8/a84e23c667fbd67f33440421196770ae new file mode 100644 index 00000000..90bbc8fb Binary files /dev/null and b/clock/Library/Artifacts/a8/a84e23c667fbd67f33440421196770ae differ diff --git a/clock/Library/Artifacts/a8/a881f2843091739e1637e8f2ec9a90b2 b/clock/Library/Artifacts/a8/a881f2843091739e1637e8f2ec9a90b2 new file mode 100644 index 00000000..38411475 Binary files /dev/null and b/clock/Library/Artifacts/a8/a881f2843091739e1637e8f2ec9a90b2 differ diff --git a/clock/Library/Artifacts/a8/a88494b55a05354c9bb057712c75ed82 b/clock/Library/Artifacts/a8/a88494b55a05354c9bb057712c75ed82 new file mode 100644 index 00000000..150b61c9 Binary files /dev/null and b/clock/Library/Artifacts/a8/a88494b55a05354c9bb057712c75ed82 differ diff --git a/clock/Library/Artifacts/a8/a8e8e217f647e860b3fe5dc21aa4b0f3 b/clock/Library/Artifacts/a8/a8e8e217f647e860b3fe5dc21aa4b0f3 new file mode 100644 index 00000000..dbfe457f Binary files /dev/null and b/clock/Library/Artifacts/a8/a8e8e217f647e860b3fe5dc21aa4b0f3 differ diff --git a/clock/Library/Artifacts/a9/a95fc36c1d6e4efb7f6eb9def5c3eced b/clock/Library/Artifacts/a9/a95fc36c1d6e4efb7f6eb9def5c3eced new file mode 100644 index 00000000..b91bb726 Binary files /dev/null and b/clock/Library/Artifacts/a9/a95fc36c1d6e4efb7f6eb9def5c3eced differ diff --git a/clock/Library/Artifacts/a9/a97e50ddea3eae95875b436841a14fb4 b/clock/Library/Artifacts/a9/a97e50ddea3eae95875b436841a14fb4 new file mode 100644 index 00000000..a3e3315e Binary files /dev/null and b/clock/Library/Artifacts/a9/a97e50ddea3eae95875b436841a14fb4 differ diff --git a/clock/Library/Artifacts/a9/a9960fe014a524de9ba59b7203e781a8 b/clock/Library/Artifacts/a9/a9960fe014a524de9ba59b7203e781a8 new file mode 100644 index 00000000..8c677db8 Binary files /dev/null and b/clock/Library/Artifacts/a9/a9960fe014a524de9ba59b7203e781a8 differ diff --git a/clock/Library/Artifacts/a9/a9d2c568bdb9481f792a66aa5f7d64f4 b/clock/Library/Artifacts/a9/a9d2c568bdb9481f792a66aa5f7d64f4 new file mode 100644 index 00000000..963464f4 Binary files /dev/null and b/clock/Library/Artifacts/a9/a9d2c568bdb9481f792a66aa5f7d64f4 differ diff --git a/clock/Library/Artifacts/a9/a9e10e6d590dda4e446732112378af5c b/clock/Library/Artifacts/a9/a9e10e6d590dda4e446732112378af5c new file mode 100644 index 00000000..5c2074f0 Binary files /dev/null and b/clock/Library/Artifacts/a9/a9e10e6d590dda4e446732112378af5c differ diff --git a/clock/Library/Artifacts/aa/aa130bb95467c8aa88362e4016f0655f b/clock/Library/Artifacts/aa/aa130bb95467c8aa88362e4016f0655f new file mode 100644 index 00000000..2e48b299 Binary files /dev/null and b/clock/Library/Artifacts/aa/aa130bb95467c8aa88362e4016f0655f differ diff --git a/clock/Library/Artifacts/aa/aa3da944582aab8ddcd06b352a05a4a6 b/clock/Library/Artifacts/aa/aa3da944582aab8ddcd06b352a05a4a6 new file mode 100644 index 00000000..c6f44435 Binary files /dev/null and b/clock/Library/Artifacts/aa/aa3da944582aab8ddcd06b352a05a4a6 differ diff --git a/clock/Library/Artifacts/aa/aa648354bba1a81903f335aacb48eb40 b/clock/Library/Artifacts/aa/aa648354bba1a81903f335aacb48eb40 new file mode 100644 index 00000000..f8e19c89 Binary files /dev/null and b/clock/Library/Artifacts/aa/aa648354bba1a81903f335aacb48eb40 differ diff --git a/clock/Library/Artifacts/aa/aad13f1c587876190720963d18383e39 b/clock/Library/Artifacts/aa/aad13f1c587876190720963d18383e39 new file mode 100644 index 00000000..03581d28 Binary files /dev/null and b/clock/Library/Artifacts/aa/aad13f1c587876190720963d18383e39 differ diff --git a/clock/Library/Artifacts/aa/aad1c70ab71c74bf6dca74929f98d8c0 b/clock/Library/Artifacts/aa/aad1c70ab71c74bf6dca74929f98d8c0 new file mode 100644 index 00000000..0feca725 Binary files /dev/null and b/clock/Library/Artifacts/aa/aad1c70ab71c74bf6dca74929f98d8c0 differ diff --git a/clock/Library/Artifacts/aa/aafbf0697069540f3ead3fe1fe4b8fed b/clock/Library/Artifacts/aa/aafbf0697069540f3ead3fe1fe4b8fed new file mode 100644 index 00000000..f1d9e9ae Binary files /dev/null and b/clock/Library/Artifacts/aa/aafbf0697069540f3ead3fe1fe4b8fed differ diff --git a/clock/Library/Artifacts/ab/ab1922186de0c85f2fa0b908b91492e2 b/clock/Library/Artifacts/ab/ab1922186de0c85f2fa0b908b91492e2 new file mode 100644 index 00000000..19ef85e8 Binary files /dev/null and b/clock/Library/Artifacts/ab/ab1922186de0c85f2fa0b908b91492e2 differ diff --git a/clock/Library/Artifacts/ab/ab3ff10a119eba99a0aafb4db933d754 b/clock/Library/Artifacts/ab/ab3ff10a119eba99a0aafb4db933d754 new file mode 100644 index 00000000..dcd70df6 Binary files /dev/null and b/clock/Library/Artifacts/ab/ab3ff10a119eba99a0aafb4db933d754 differ diff --git a/clock/Library/Artifacts/ab/ab48e32f93e71cc83b4eea24d0702ed1 b/clock/Library/Artifacts/ab/ab48e32f93e71cc83b4eea24d0702ed1 new file mode 100644 index 00000000..fed5d33f Binary files /dev/null and b/clock/Library/Artifacts/ab/ab48e32f93e71cc83b4eea24d0702ed1 differ diff --git a/clock/Library/Artifacts/ab/ab734d33b53c6aa65fcdf38cdd341160 b/clock/Library/Artifacts/ab/ab734d33b53c6aa65fcdf38cdd341160 new file mode 100644 index 00000000..f6a2986f Binary files /dev/null and b/clock/Library/Artifacts/ab/ab734d33b53c6aa65fcdf38cdd341160 differ diff --git a/clock/Library/Artifacts/ab/ab81ceae428ff67984da5559cfa47feb b/clock/Library/Artifacts/ab/ab81ceae428ff67984da5559cfa47feb new file mode 100644 index 00000000..9c5e84fe Binary files /dev/null and b/clock/Library/Artifacts/ab/ab81ceae428ff67984da5559cfa47feb differ diff --git a/clock/Library/Artifacts/ab/ab8cfa5560aa63fb30f53d867b335130 b/clock/Library/Artifacts/ab/ab8cfa5560aa63fb30f53d867b335130 new file mode 100644 index 00000000..5dfa4d80 Binary files /dev/null and b/clock/Library/Artifacts/ab/ab8cfa5560aa63fb30f53d867b335130 differ diff --git a/clock/Library/Artifacts/ab/ab8d56365d122860fad45e4c1237734e b/clock/Library/Artifacts/ab/ab8d56365d122860fad45e4c1237734e new file mode 100644 index 00000000..08e89833 Binary files /dev/null and b/clock/Library/Artifacts/ab/ab8d56365d122860fad45e4c1237734e differ diff --git a/clock/Library/Artifacts/ab/ab91045955d8d8d38c97d502f926da4b b/clock/Library/Artifacts/ab/ab91045955d8d8d38c97d502f926da4b new file mode 100644 index 00000000..e19aafe4 Binary files /dev/null and b/clock/Library/Artifacts/ab/ab91045955d8d8d38c97d502f926da4b differ diff --git a/clock/Library/Artifacts/ab/abc088bfbec2b4456697e5792f266653 b/clock/Library/Artifacts/ab/abc088bfbec2b4456697e5792f266653 new file mode 100644 index 00000000..4b50ab01 Binary files /dev/null and b/clock/Library/Artifacts/ab/abc088bfbec2b4456697e5792f266653 differ diff --git a/clock/Library/Artifacts/ab/abcdaa363a1ecdcb8ae1fafcf3b51969 b/clock/Library/Artifacts/ab/abcdaa363a1ecdcb8ae1fafcf3b51969 new file mode 100644 index 00000000..7cb59f42 Binary files /dev/null and b/clock/Library/Artifacts/ab/abcdaa363a1ecdcb8ae1fafcf3b51969 differ diff --git a/clock/Library/Artifacts/ab/abf0f2bc37e7f80c537d3f8379acc404 b/clock/Library/Artifacts/ab/abf0f2bc37e7f80c537d3f8379acc404 new file mode 100644 index 00000000..224a6a3f Binary files /dev/null and b/clock/Library/Artifacts/ab/abf0f2bc37e7f80c537d3f8379acc404 differ diff --git a/clock/Library/Artifacts/ab/abf1c012ec71f544a78e5cf0144d9d2b b/clock/Library/Artifacts/ab/abf1c012ec71f544a78e5cf0144d9d2b new file mode 100644 index 00000000..5ad8c1f2 Binary files /dev/null and b/clock/Library/Artifacts/ab/abf1c012ec71f544a78e5cf0144d9d2b differ diff --git a/clock/Library/Artifacts/ab/abfe0ca15be088b9dcfe631fe450304c b/clock/Library/Artifacts/ab/abfe0ca15be088b9dcfe631fe450304c new file mode 100644 index 00000000..8d1da09e Binary files /dev/null and b/clock/Library/Artifacts/ab/abfe0ca15be088b9dcfe631fe450304c differ diff --git a/clock/Library/Artifacts/ac/ac045016faba8936f543b141eedc872d b/clock/Library/Artifacts/ac/ac045016faba8936f543b141eedc872d new file mode 100644 index 00000000..f9962d30 Binary files /dev/null and b/clock/Library/Artifacts/ac/ac045016faba8936f543b141eedc872d differ diff --git a/clock/Library/Artifacts/ac/ac1fd182ce3a158abada56e8d5302d2b b/clock/Library/Artifacts/ac/ac1fd182ce3a158abada56e8d5302d2b new file mode 100644 index 00000000..ef8db180 Binary files /dev/null and b/clock/Library/Artifacts/ac/ac1fd182ce3a158abada56e8d5302d2b differ diff --git a/clock/Library/Artifacts/ac/ac3da59e245d07f3257aa3d60ca9953c b/clock/Library/Artifacts/ac/ac3da59e245d07f3257aa3d60ca9953c new file mode 100644 index 00000000..a34e9fc1 Binary files /dev/null and b/clock/Library/Artifacts/ac/ac3da59e245d07f3257aa3d60ca9953c differ diff --git a/clock/Library/Artifacts/ac/ac5a9307bef24f9a64b5bed5d2f280cf b/clock/Library/Artifacts/ac/ac5a9307bef24f9a64b5bed5d2f280cf new file mode 100644 index 00000000..48d435d4 Binary files /dev/null and b/clock/Library/Artifacts/ac/ac5a9307bef24f9a64b5bed5d2f280cf differ diff --git a/clock/Library/Artifacts/ac/ac6c9eaca624194b7a8f9224a49f071c b/clock/Library/Artifacts/ac/ac6c9eaca624194b7a8f9224a49f071c new file mode 100644 index 00000000..b5e0b931 Binary files /dev/null and b/clock/Library/Artifacts/ac/ac6c9eaca624194b7a8f9224a49f071c differ diff --git a/clock/Library/Artifacts/ac/acb208dd90005c73b776c98d73bbda49 b/clock/Library/Artifacts/ac/acb208dd90005c73b776c98d73bbda49 new file mode 100644 index 00000000..0de7e3e3 Binary files /dev/null and b/clock/Library/Artifacts/ac/acb208dd90005c73b776c98d73bbda49 differ diff --git a/clock/Library/Artifacts/ac/acd9e0bff314d33217ff3aade43fd5d8 b/clock/Library/Artifacts/ac/acd9e0bff314d33217ff3aade43fd5d8 new file mode 100644 index 00000000..dfc002f2 Binary files /dev/null and b/clock/Library/Artifacts/ac/acd9e0bff314d33217ff3aade43fd5d8 differ diff --git a/clock/Library/Artifacts/ac/acf93eab434b489bdc77702286967b36 b/clock/Library/Artifacts/ac/acf93eab434b489bdc77702286967b36 new file mode 100644 index 00000000..2187aecf Binary files /dev/null and b/clock/Library/Artifacts/ac/acf93eab434b489bdc77702286967b36 differ diff --git a/clock/Library/Artifacts/ad/ad1301e014dd1873784a9273b883c4f8 b/clock/Library/Artifacts/ad/ad1301e014dd1873784a9273b883c4f8 new file mode 100644 index 00000000..0d4c371f Binary files /dev/null and b/clock/Library/Artifacts/ad/ad1301e014dd1873784a9273b883c4f8 differ diff --git a/clock/Library/Artifacts/ad/ad1cf960ddecc0c3cce66942f4107f9e b/clock/Library/Artifacts/ad/ad1cf960ddecc0c3cce66942f4107f9e new file mode 100644 index 00000000..fd1338a1 Binary files /dev/null and b/clock/Library/Artifacts/ad/ad1cf960ddecc0c3cce66942f4107f9e differ diff --git a/clock/Library/Artifacts/ad/ad39227fe401bbf979e0138ef785c582 b/clock/Library/Artifacts/ad/ad39227fe401bbf979e0138ef785c582 new file mode 100644 index 00000000..f92754c9 Binary files /dev/null and b/clock/Library/Artifacts/ad/ad39227fe401bbf979e0138ef785c582 differ diff --git a/clock/Library/Artifacts/ad/ad40db2c3f251c401a10af5340bb1eee b/clock/Library/Artifacts/ad/ad40db2c3f251c401a10af5340bb1eee new file mode 100644 index 00000000..30d7a97e Binary files /dev/null and b/clock/Library/Artifacts/ad/ad40db2c3f251c401a10af5340bb1eee differ diff --git a/clock/Library/Artifacts/ad/ad5704c4a71b2bf2f859491dcf5297ff b/clock/Library/Artifacts/ad/ad5704c4a71b2bf2f859491dcf5297ff new file mode 100644 index 00000000..2f898eed Binary files /dev/null and b/clock/Library/Artifacts/ad/ad5704c4a71b2bf2f859491dcf5297ff differ diff --git a/clock/Library/Artifacts/ad/ad78a8b631e32d7e83b60e5ce52cf329 b/clock/Library/Artifacts/ad/ad78a8b631e32d7e83b60e5ce52cf329 new file mode 100644 index 00000000..f8516091 Binary files /dev/null and b/clock/Library/Artifacts/ad/ad78a8b631e32d7e83b60e5ce52cf329 differ diff --git a/clock/Library/Artifacts/ad/ad7e114d81adfbc4df800e4d966142b8 b/clock/Library/Artifacts/ad/ad7e114d81adfbc4df800e4d966142b8 new file mode 100644 index 00000000..daafc29f Binary files /dev/null and b/clock/Library/Artifacts/ad/ad7e114d81adfbc4df800e4d966142b8 differ diff --git a/clock/Library/Artifacts/ad/adacb00720bf0a4bd0f83d0411c5effc b/clock/Library/Artifacts/ad/adacb00720bf0a4bd0f83d0411c5effc new file mode 100644 index 00000000..614438e4 Binary files /dev/null and b/clock/Library/Artifacts/ad/adacb00720bf0a4bd0f83d0411c5effc differ diff --git a/clock/Library/Artifacts/ad/adba21b97acc8979c225b9a1829f51c0 b/clock/Library/Artifacts/ad/adba21b97acc8979c225b9a1829f51c0 new file mode 100644 index 00000000..80e8da16 Binary files /dev/null and b/clock/Library/Artifacts/ad/adba21b97acc8979c225b9a1829f51c0 differ diff --git a/clock/Library/Artifacts/ad/add3807966f73f68a10333821d37c06b b/clock/Library/Artifacts/ad/add3807966f73f68a10333821d37c06b new file mode 100644 index 00000000..6db21493 Binary files /dev/null and b/clock/Library/Artifacts/ad/add3807966f73f68a10333821d37c06b differ diff --git a/clock/Library/Artifacts/ae/ae178c53dfdc6106c4f74b5d0c9af237 b/clock/Library/Artifacts/ae/ae178c53dfdc6106c4f74b5d0c9af237 new file mode 100644 index 00000000..b418f5d2 Binary files /dev/null and b/clock/Library/Artifacts/ae/ae178c53dfdc6106c4f74b5d0c9af237 differ diff --git a/clock/Library/Artifacts/ae/ae20ebc0627d9fb0e0d7b7c0ef308d5d b/clock/Library/Artifacts/ae/ae20ebc0627d9fb0e0d7b7c0ef308d5d new file mode 100644 index 00000000..8d8b3202 Binary files /dev/null and b/clock/Library/Artifacts/ae/ae20ebc0627d9fb0e0d7b7c0ef308d5d differ diff --git a/clock/Library/Artifacts/ae/ae33e47ca2c8247394a6fbf66585009f b/clock/Library/Artifacts/ae/ae33e47ca2c8247394a6fbf66585009f new file mode 100644 index 00000000..46e2da41 Binary files /dev/null and b/clock/Library/Artifacts/ae/ae33e47ca2c8247394a6fbf66585009f differ diff --git a/clock/Library/Artifacts/ae/ae629ad937e874df997d94f7aeb851cc b/clock/Library/Artifacts/ae/ae629ad937e874df997d94f7aeb851cc new file mode 100644 index 00000000..e1a68bf7 Binary files /dev/null and b/clock/Library/Artifacts/ae/ae629ad937e874df997d94f7aeb851cc differ diff --git a/clock/Library/Artifacts/ae/ae6c3ceae1766c86fe5737211e78896a b/clock/Library/Artifacts/ae/ae6c3ceae1766c86fe5737211e78896a new file mode 100644 index 00000000..ffa4c580 Binary files /dev/null and b/clock/Library/Artifacts/ae/ae6c3ceae1766c86fe5737211e78896a differ diff --git a/clock/Library/Artifacts/ae/aec6a93d6ed49311ab0ae985341cc507 b/clock/Library/Artifacts/ae/aec6a93d6ed49311ab0ae985341cc507 new file mode 100644 index 00000000..94c261d1 Binary files /dev/null and b/clock/Library/Artifacts/ae/aec6a93d6ed49311ab0ae985341cc507 differ diff --git a/clock/Library/Artifacts/ae/aeedf3d723c279cec1eadfd53ac3f9c6 b/clock/Library/Artifacts/ae/aeedf3d723c279cec1eadfd53ac3f9c6 new file mode 100644 index 00000000..3649e261 Binary files /dev/null and b/clock/Library/Artifacts/ae/aeedf3d723c279cec1eadfd53ac3f9c6 differ diff --git a/clock/Library/Artifacts/ae/aef079c9d3aff65a19cd97a1c70175ec b/clock/Library/Artifacts/ae/aef079c9d3aff65a19cd97a1c70175ec new file mode 100644 index 00000000..a45883f0 Binary files /dev/null and b/clock/Library/Artifacts/ae/aef079c9d3aff65a19cd97a1c70175ec differ diff --git a/clock/Library/Artifacts/af/af111f9fe3960cc6a8968b3e517398c9 b/clock/Library/Artifacts/af/af111f9fe3960cc6a8968b3e517398c9 new file mode 100644 index 00000000..55ba0ab1 Binary files /dev/null and b/clock/Library/Artifacts/af/af111f9fe3960cc6a8968b3e517398c9 differ diff --git a/clock/Library/Artifacts/af/af1926b0acc509a29ac2a0aa2f1a0973 b/clock/Library/Artifacts/af/af1926b0acc509a29ac2a0aa2f1a0973 new file mode 100644 index 00000000..f64607a2 Binary files /dev/null and b/clock/Library/Artifacts/af/af1926b0acc509a29ac2a0aa2f1a0973 differ diff --git a/clock/Library/Artifacts/af/af27c1c0c9abd056abd11d177ab92b28 b/clock/Library/Artifacts/af/af27c1c0c9abd056abd11d177ab92b28 new file mode 100644 index 00000000..a128dc6b Binary files /dev/null and b/clock/Library/Artifacts/af/af27c1c0c9abd056abd11d177ab92b28 differ diff --git a/clock/Library/Artifacts/af/af45b10a2df72ae51636b5b6b234dc7f b/clock/Library/Artifacts/af/af45b10a2df72ae51636b5b6b234dc7f new file mode 100644 index 00000000..09048064 Binary files /dev/null and b/clock/Library/Artifacts/af/af45b10a2df72ae51636b5b6b234dc7f differ diff --git a/clock/Library/Artifacts/b0/b012f235ad5be63bcae6f4fd5e401099 b/clock/Library/Artifacts/b0/b012f235ad5be63bcae6f4fd5e401099 new file mode 100644 index 00000000..67dd2fdf Binary files /dev/null and b/clock/Library/Artifacts/b0/b012f235ad5be63bcae6f4fd5e401099 differ diff --git a/clock/Library/Artifacts/b0/b0328bc0cf534caab641168f5606d75e b/clock/Library/Artifacts/b0/b0328bc0cf534caab641168f5606d75e new file mode 100644 index 00000000..c428f294 Binary files /dev/null and b/clock/Library/Artifacts/b0/b0328bc0cf534caab641168f5606d75e differ diff --git a/clock/Library/Artifacts/b0/b050b81a993066132a7f23d774d46afc b/clock/Library/Artifacts/b0/b050b81a993066132a7f23d774d46afc new file mode 100644 index 00000000..e335f4a0 Binary files /dev/null and b/clock/Library/Artifacts/b0/b050b81a993066132a7f23d774d46afc differ diff --git a/clock/Library/Artifacts/b0/b056a021fb76e7347f7bd198eae66d1b b/clock/Library/Artifacts/b0/b056a021fb76e7347f7bd198eae66d1b new file mode 100644 index 00000000..a2be39d1 Binary files /dev/null and b/clock/Library/Artifacts/b0/b056a021fb76e7347f7bd198eae66d1b differ diff --git a/clock/Library/Artifacts/b0/b064320f1a2a0b9ba5b339b27a7b49f7 b/clock/Library/Artifacts/b0/b064320f1a2a0b9ba5b339b27a7b49f7 new file mode 100644 index 00000000..ad128003 Binary files /dev/null and b/clock/Library/Artifacts/b0/b064320f1a2a0b9ba5b339b27a7b49f7 differ diff --git a/clock/Library/Artifacts/b0/b066bea681dce09ce59f12c41a68c8be b/clock/Library/Artifacts/b0/b066bea681dce09ce59f12c41a68c8be new file mode 100644 index 00000000..10950b94 Binary files /dev/null and b/clock/Library/Artifacts/b0/b066bea681dce09ce59f12c41a68c8be differ diff --git a/clock/Library/Artifacts/b0/b08babe249006fba562319547432b014 b/clock/Library/Artifacts/b0/b08babe249006fba562319547432b014 new file mode 100644 index 00000000..8ac47b5c Binary files /dev/null and b/clock/Library/Artifacts/b0/b08babe249006fba562319547432b014 differ diff --git a/clock/Library/Artifacts/b0/b09f690028c4eea5fb5d8d0983a6f467 b/clock/Library/Artifacts/b0/b09f690028c4eea5fb5d8d0983a6f467 new file mode 100644 index 00000000..a7a3a120 Binary files /dev/null and b/clock/Library/Artifacts/b0/b09f690028c4eea5fb5d8d0983a6f467 differ diff --git a/clock/Library/Artifacts/b0/b0ee2c03f786b0475b73723d24f838a9 b/clock/Library/Artifacts/b0/b0ee2c03f786b0475b73723d24f838a9 new file mode 100644 index 00000000..b066e7b5 Binary files /dev/null and b/clock/Library/Artifacts/b0/b0ee2c03f786b0475b73723d24f838a9 differ diff --git a/clock/Library/Artifacts/b0/b0fda695c176e4c176221bdfc5577af3 b/clock/Library/Artifacts/b0/b0fda695c176e4c176221bdfc5577af3 new file mode 100644 index 00000000..1f17678e Binary files /dev/null and b/clock/Library/Artifacts/b0/b0fda695c176e4c176221bdfc5577af3 differ diff --git a/clock/Library/Artifacts/b1/b1122c6eb0fc05f5f97c13695d79d02f b/clock/Library/Artifacts/b1/b1122c6eb0fc05f5f97c13695d79d02f new file mode 100644 index 00000000..822d8622 Binary files /dev/null and b/clock/Library/Artifacts/b1/b1122c6eb0fc05f5f97c13695d79d02f differ diff --git a/clock/Library/Artifacts/b1/b13a5e326b7208114af37e0362122314 b/clock/Library/Artifacts/b1/b13a5e326b7208114af37e0362122314 new file mode 100644 index 00000000..bceb7e35 Binary files /dev/null and b/clock/Library/Artifacts/b1/b13a5e326b7208114af37e0362122314 differ diff --git a/clock/Library/Artifacts/b1/b159926bf408aee8fc881e000e1f77a5 b/clock/Library/Artifacts/b1/b159926bf408aee8fc881e000e1f77a5 new file mode 100644 index 00000000..2bc13ea4 Binary files /dev/null and b/clock/Library/Artifacts/b1/b159926bf408aee8fc881e000e1f77a5 differ diff --git a/clock/Library/Artifacts/b1/b1d8b882578f0d9cbed899be1d3557fd b/clock/Library/Artifacts/b1/b1d8b882578f0d9cbed899be1d3557fd new file mode 100644 index 00000000..4568b04d Binary files /dev/null and b/clock/Library/Artifacts/b1/b1d8b882578f0d9cbed899be1d3557fd differ diff --git a/clock/Library/Artifacts/b1/b1e877e3da2dba5c46f2d1567792681f b/clock/Library/Artifacts/b1/b1e877e3da2dba5c46f2d1567792681f new file mode 100644 index 00000000..fa6adcb9 Binary files /dev/null and b/clock/Library/Artifacts/b1/b1e877e3da2dba5c46f2d1567792681f differ diff --git a/clock/Library/Artifacts/b2/b20ced8b0fc79a4d868d3c8dcfacd025 b/clock/Library/Artifacts/b2/b20ced8b0fc79a4d868d3c8dcfacd025 new file mode 100644 index 00000000..f5c9c90b Binary files /dev/null and b/clock/Library/Artifacts/b2/b20ced8b0fc79a4d868d3c8dcfacd025 differ diff --git a/clock/Library/Artifacts/b2/b21210292f2681800f7c32ea432e8966 b/clock/Library/Artifacts/b2/b21210292f2681800f7c32ea432e8966 new file mode 100644 index 00000000..9af1c129 Binary files /dev/null and b/clock/Library/Artifacts/b2/b21210292f2681800f7c32ea432e8966 differ diff --git a/clock/Library/Artifacts/b2/b222738e48bf277db92916329368d39a b/clock/Library/Artifacts/b2/b222738e48bf277db92916329368d39a new file mode 100644 index 00000000..f9a62dc6 Binary files /dev/null and b/clock/Library/Artifacts/b2/b222738e48bf277db92916329368d39a differ diff --git a/clock/Library/Artifacts/b2/b24bfc70101c093f6eba77acd2c1a261 b/clock/Library/Artifacts/b2/b24bfc70101c093f6eba77acd2c1a261 new file mode 100644 index 00000000..174925dc Binary files /dev/null and b/clock/Library/Artifacts/b2/b24bfc70101c093f6eba77acd2c1a261 differ diff --git a/clock/Library/Artifacts/b2/b26a9c9528b69a2495eb51328654ed7b b/clock/Library/Artifacts/b2/b26a9c9528b69a2495eb51328654ed7b new file mode 100644 index 00000000..6ff7f3b8 Binary files /dev/null and b/clock/Library/Artifacts/b2/b26a9c9528b69a2495eb51328654ed7b differ diff --git a/clock/Library/Artifacts/b2/b2d53af81d2c670fd0873b14d7745e2a b/clock/Library/Artifacts/b2/b2d53af81d2c670fd0873b14d7745e2a new file mode 100644 index 00000000..cbaab1e9 Binary files /dev/null and b/clock/Library/Artifacts/b2/b2d53af81d2c670fd0873b14d7745e2a differ diff --git a/clock/Library/Artifacts/b2/b2eedd90237426216343f8e6eee9feb7 b/clock/Library/Artifacts/b2/b2eedd90237426216343f8e6eee9feb7 new file mode 100644 index 00000000..accd1749 Binary files /dev/null and b/clock/Library/Artifacts/b2/b2eedd90237426216343f8e6eee9feb7 differ diff --git a/clock/Library/Artifacts/b3/b35ef6b1d7bd08fa9aefc3c5e7e93dd4 b/clock/Library/Artifacts/b3/b35ef6b1d7bd08fa9aefc3c5e7e93dd4 new file mode 100644 index 00000000..6efb4a0e Binary files /dev/null and b/clock/Library/Artifacts/b3/b35ef6b1d7bd08fa9aefc3c5e7e93dd4 differ diff --git a/clock/Library/Artifacts/b3/b3b1c3f5f96f9395c6947701060e5bb1 b/clock/Library/Artifacts/b3/b3b1c3f5f96f9395c6947701060e5bb1 new file mode 100644 index 00000000..67fef8c9 Binary files /dev/null and b/clock/Library/Artifacts/b3/b3b1c3f5f96f9395c6947701060e5bb1 differ diff --git a/clock/Library/Artifacts/b3/b3eb60535ee6d6990c81eed5ebb19e73 b/clock/Library/Artifacts/b3/b3eb60535ee6d6990c81eed5ebb19e73 new file mode 100644 index 00000000..373222e1 Binary files /dev/null and b/clock/Library/Artifacts/b3/b3eb60535ee6d6990c81eed5ebb19e73 differ diff --git a/clock/Library/Artifacts/b3/b3eeb948ad3f62b0d499700223e2000a b/clock/Library/Artifacts/b3/b3eeb948ad3f62b0d499700223e2000a new file mode 100644 index 00000000..d727329c Binary files /dev/null and b/clock/Library/Artifacts/b3/b3eeb948ad3f62b0d499700223e2000a differ diff --git a/clock/Library/Artifacts/b4/b4097ee2f054b38a44fc8914831548a8 b/clock/Library/Artifacts/b4/b4097ee2f054b38a44fc8914831548a8 new file mode 100644 index 00000000..4085c262 Binary files /dev/null and b/clock/Library/Artifacts/b4/b4097ee2f054b38a44fc8914831548a8 differ diff --git a/clock/Library/Artifacts/b4/b42f63c3ed5931e22cf638a42580b626 b/clock/Library/Artifacts/b4/b42f63c3ed5931e22cf638a42580b626 new file mode 100644 index 00000000..97ced366 Binary files /dev/null and b/clock/Library/Artifacts/b4/b42f63c3ed5931e22cf638a42580b626 differ diff --git a/clock/Library/Artifacts/b4/b4452684cb2bdbfda12f2744cfe777bc b/clock/Library/Artifacts/b4/b4452684cb2bdbfda12f2744cfe777bc new file mode 100644 index 00000000..5f1406c2 Binary files /dev/null and b/clock/Library/Artifacts/b4/b4452684cb2bdbfda12f2744cfe777bc differ diff --git a/clock/Library/Artifacts/b4/b47544da2d02198d2b4c7e885362e19d b/clock/Library/Artifacts/b4/b47544da2d02198d2b4c7e885362e19d new file mode 100644 index 00000000..9f3a006b Binary files /dev/null and b/clock/Library/Artifacts/b4/b47544da2d02198d2b4c7e885362e19d differ diff --git a/clock/Library/Artifacts/b4/b4b7aef2330ee117399c2f4fad91a2d0 b/clock/Library/Artifacts/b4/b4b7aef2330ee117399c2f4fad91a2d0 new file mode 100644 index 00000000..286264dd Binary files /dev/null and b/clock/Library/Artifacts/b4/b4b7aef2330ee117399c2f4fad91a2d0 differ diff --git a/clock/Library/Artifacts/b4/b4dc65702c2cccb92e71e0daa3ab517d b/clock/Library/Artifacts/b4/b4dc65702c2cccb92e71e0daa3ab517d new file mode 100644 index 00000000..5c0b64a3 Binary files /dev/null and b/clock/Library/Artifacts/b4/b4dc65702c2cccb92e71e0daa3ab517d differ diff --git a/clock/Library/Artifacts/b5/b5063bd84106498f004a6823a08ec28c b/clock/Library/Artifacts/b5/b5063bd84106498f004a6823a08ec28c new file mode 100644 index 00000000..b6b410e6 Binary files /dev/null and b/clock/Library/Artifacts/b5/b5063bd84106498f004a6823a08ec28c differ diff --git a/clock/Library/Artifacts/b5/b52d81884cc76f118ae74d0fba4b4eea b/clock/Library/Artifacts/b5/b52d81884cc76f118ae74d0fba4b4eea new file mode 100644 index 00000000..c8795968 Binary files /dev/null and b/clock/Library/Artifacts/b5/b52d81884cc76f118ae74d0fba4b4eea differ diff --git a/clock/Library/Artifacts/b5/b5e3051b6ac281922145f6770fc37163 b/clock/Library/Artifacts/b5/b5e3051b6ac281922145f6770fc37163 new file mode 100644 index 00000000..90b7b869 Binary files /dev/null and b/clock/Library/Artifacts/b5/b5e3051b6ac281922145f6770fc37163 differ diff --git a/clock/Library/Artifacts/b5/b5f40cb242f00f443662fe9b6a9b19f7 b/clock/Library/Artifacts/b5/b5f40cb242f00f443662fe9b6a9b19f7 new file mode 100644 index 00000000..5f2e2b27 Binary files /dev/null and b/clock/Library/Artifacts/b5/b5f40cb242f00f443662fe9b6a9b19f7 differ diff --git a/clock/Library/Artifacts/b6/b6490ac94fa28bcac15533002d23d8f1 b/clock/Library/Artifacts/b6/b6490ac94fa28bcac15533002d23d8f1 new file mode 100644 index 00000000..5e6b137d Binary files /dev/null and b/clock/Library/Artifacts/b6/b6490ac94fa28bcac15533002d23d8f1 differ diff --git a/clock/Library/Artifacts/b6/b67a24e61f177e8d18249015067a8ab6 b/clock/Library/Artifacts/b6/b67a24e61f177e8d18249015067a8ab6 new file mode 100644 index 00000000..1af67981 Binary files /dev/null and b/clock/Library/Artifacts/b6/b67a24e61f177e8d18249015067a8ab6 differ diff --git a/clock/Library/Artifacts/b6/b67a8215381f3b08a02d7de3990e832a b/clock/Library/Artifacts/b6/b67a8215381f3b08a02d7de3990e832a new file mode 100644 index 00000000..62891ede Binary files /dev/null and b/clock/Library/Artifacts/b6/b67a8215381f3b08a02d7de3990e832a differ diff --git a/clock/Library/Artifacts/b6/b6c2a88f7065353e7e3d7c2996fc5406 b/clock/Library/Artifacts/b6/b6c2a88f7065353e7e3d7c2996fc5406 new file mode 100644 index 00000000..bcbd71ce Binary files /dev/null and b/clock/Library/Artifacts/b6/b6c2a88f7065353e7e3d7c2996fc5406 differ diff --git a/clock/Library/Artifacts/b6/b6ce372b8f390ef35ed851fc045f1368 b/clock/Library/Artifacts/b6/b6ce372b8f390ef35ed851fc045f1368 new file mode 100644 index 00000000..e1c53d6a Binary files /dev/null and b/clock/Library/Artifacts/b6/b6ce372b8f390ef35ed851fc045f1368 differ diff --git a/clock/Library/Artifacts/b7/b70147325a554290019d3a6a7bdf0949 b/clock/Library/Artifacts/b7/b70147325a554290019d3a6a7bdf0949 new file mode 100644 index 00000000..e17f5e49 Binary files /dev/null and b/clock/Library/Artifacts/b7/b70147325a554290019d3a6a7bdf0949 differ diff --git a/clock/Library/Artifacts/b7/b71b55c431f0d4ca303fe1278298d80a b/clock/Library/Artifacts/b7/b71b55c431f0d4ca303fe1278298d80a new file mode 100644 index 00000000..57b42419 Binary files /dev/null and b/clock/Library/Artifacts/b7/b71b55c431f0d4ca303fe1278298d80a differ diff --git a/clock/Library/Artifacts/b7/b7334838224bcd7a56f8008ba54e48bb b/clock/Library/Artifacts/b7/b7334838224bcd7a56f8008ba54e48bb new file mode 100644 index 00000000..6bb11cf2 Binary files /dev/null and b/clock/Library/Artifacts/b7/b7334838224bcd7a56f8008ba54e48bb differ diff --git a/clock/Library/Artifacts/b7/b74d2ca43edbe5c9f38de2faddee604e b/clock/Library/Artifacts/b7/b74d2ca43edbe5c9f38de2faddee604e new file mode 100644 index 00000000..f02d5835 Binary files /dev/null and b/clock/Library/Artifacts/b7/b74d2ca43edbe5c9f38de2faddee604e differ diff --git a/clock/Library/Artifacts/b7/b7be73ab80deeaa6190bb0c5269a39fb b/clock/Library/Artifacts/b7/b7be73ab80deeaa6190bb0c5269a39fb new file mode 100644 index 00000000..43174c3f Binary files /dev/null and b/clock/Library/Artifacts/b7/b7be73ab80deeaa6190bb0c5269a39fb differ diff --git a/clock/Library/Artifacts/b7/b7c1235e76d578a7de744099117731fb b/clock/Library/Artifacts/b7/b7c1235e76d578a7de744099117731fb new file mode 100644 index 00000000..1150edc8 Binary files /dev/null and b/clock/Library/Artifacts/b7/b7c1235e76d578a7de744099117731fb differ diff --git a/clock/Library/Artifacts/b7/b7d6e3cc87b129c0c19062b30f842df6 b/clock/Library/Artifacts/b7/b7d6e3cc87b129c0c19062b30f842df6 new file mode 100644 index 00000000..280f3928 Binary files /dev/null and b/clock/Library/Artifacts/b7/b7d6e3cc87b129c0c19062b30f842df6 differ diff --git a/clock/Library/Artifacts/b8/b8041f7bd21eee191980dd9f5e519aff b/clock/Library/Artifacts/b8/b8041f7bd21eee191980dd9f5e519aff new file mode 100644 index 00000000..1083b3e2 Binary files /dev/null and b/clock/Library/Artifacts/b8/b8041f7bd21eee191980dd9f5e519aff differ diff --git a/clock/Library/Artifacts/b8/b81e53003a33942f4622b21e35477888 b/clock/Library/Artifacts/b8/b81e53003a33942f4622b21e35477888 new file mode 100644 index 00000000..790e9703 Binary files /dev/null and b/clock/Library/Artifacts/b8/b81e53003a33942f4622b21e35477888 differ diff --git a/clock/Library/Artifacts/b8/b84e1feab7218e5403105a9974153bfb b/clock/Library/Artifacts/b8/b84e1feab7218e5403105a9974153bfb new file mode 100644 index 00000000..dadd7584 Binary files /dev/null and b/clock/Library/Artifacts/b8/b84e1feab7218e5403105a9974153bfb differ diff --git a/clock/Library/Artifacts/b8/b886b19637bd6d161ae284509b0689d7 b/clock/Library/Artifacts/b8/b886b19637bd6d161ae284509b0689d7 new file mode 100644 index 00000000..732af089 Binary files /dev/null and b/clock/Library/Artifacts/b8/b886b19637bd6d161ae284509b0689d7 differ diff --git a/clock/Library/Artifacts/b8/b89edc64422d9dfde5c6c5eda089a204 b/clock/Library/Artifacts/b8/b89edc64422d9dfde5c6c5eda089a204 new file mode 100644 index 00000000..0c30c809 Binary files /dev/null and b/clock/Library/Artifacts/b8/b89edc64422d9dfde5c6c5eda089a204 differ diff --git a/clock/Library/Artifacts/b8/b8aaac0250bbbbe471f4db1f79214a0f b/clock/Library/Artifacts/b8/b8aaac0250bbbbe471f4db1f79214a0f new file mode 100644 index 00000000..054b6de2 Binary files /dev/null and b/clock/Library/Artifacts/b8/b8aaac0250bbbbe471f4db1f79214a0f differ diff --git a/clock/Library/Artifacts/b8/b8b2360614249041d35cc3fe8f4c87ea b/clock/Library/Artifacts/b8/b8b2360614249041d35cc3fe8f4c87ea new file mode 100644 index 00000000..be9416ac Binary files /dev/null and b/clock/Library/Artifacts/b8/b8b2360614249041d35cc3fe8f4c87ea differ diff --git a/clock/Library/Artifacts/b8/b8ced4d0b2aacb77831d52ed263334be b/clock/Library/Artifacts/b8/b8ced4d0b2aacb77831d52ed263334be new file mode 100644 index 00000000..89d00002 Binary files /dev/null and b/clock/Library/Artifacts/b8/b8ced4d0b2aacb77831d52ed263334be differ diff --git a/clock/Library/Artifacts/b8/b8d8c2118de6a342ab5fa641a19c3490 b/clock/Library/Artifacts/b8/b8d8c2118de6a342ab5fa641a19c3490 new file mode 100644 index 00000000..393f6efe Binary files /dev/null and b/clock/Library/Artifacts/b8/b8d8c2118de6a342ab5fa641a19c3490 differ diff --git a/clock/Library/Artifacts/b8/b8e8c05d0d49c58de18374b3a497248b b/clock/Library/Artifacts/b8/b8e8c05d0d49c58de18374b3a497248b new file mode 100644 index 00000000..e1922f0c Binary files /dev/null and b/clock/Library/Artifacts/b8/b8e8c05d0d49c58de18374b3a497248b differ diff --git a/clock/Library/Artifacts/b8/b8fe05ba31bef49597e07dcca2627e0a b/clock/Library/Artifacts/b8/b8fe05ba31bef49597e07dcca2627e0a new file mode 100644 index 00000000..878f535a Binary files /dev/null and b/clock/Library/Artifacts/b8/b8fe05ba31bef49597e07dcca2627e0a differ diff --git a/clock/Library/Artifacts/b9/b903c62c7a9bb5d5b20768f6a60213ec b/clock/Library/Artifacts/b9/b903c62c7a9bb5d5b20768f6a60213ec new file mode 100644 index 00000000..0499dc9c Binary files /dev/null and b/clock/Library/Artifacts/b9/b903c62c7a9bb5d5b20768f6a60213ec differ diff --git a/clock/Library/Artifacts/b9/b95b0145b3799f4e263510b0fd1c3b38 b/clock/Library/Artifacts/b9/b95b0145b3799f4e263510b0fd1c3b38 new file mode 100644 index 00000000..7bd417b6 Binary files /dev/null and b/clock/Library/Artifacts/b9/b95b0145b3799f4e263510b0fd1c3b38 differ diff --git a/clock/Library/Artifacts/b9/b974c93676e5405643557a73c0c20ec6 b/clock/Library/Artifacts/b9/b974c93676e5405643557a73c0c20ec6 new file mode 100644 index 00000000..0bfa83b1 Binary files /dev/null and b/clock/Library/Artifacts/b9/b974c93676e5405643557a73c0c20ec6 differ diff --git a/clock/Library/Artifacts/b9/b979a1d8b143fa558129eb071d23c579 b/clock/Library/Artifacts/b9/b979a1d8b143fa558129eb071d23c579 new file mode 100644 index 00000000..b83d7c9e Binary files /dev/null and b/clock/Library/Artifacts/b9/b979a1d8b143fa558129eb071d23c579 differ diff --git a/clock/Library/Artifacts/b9/b9888c41db9d61d02b3758cb3c92720a b/clock/Library/Artifacts/b9/b9888c41db9d61d02b3758cb3c92720a new file mode 100644 index 00000000..a10a3b05 Binary files /dev/null and b/clock/Library/Artifacts/b9/b9888c41db9d61d02b3758cb3c92720a differ diff --git a/clock/Library/Artifacts/b9/b9c435eea0694727dbbd821adec004be b/clock/Library/Artifacts/b9/b9c435eea0694727dbbd821adec004be new file mode 100644 index 00000000..b9f5d9f3 Binary files /dev/null and b/clock/Library/Artifacts/b9/b9c435eea0694727dbbd821adec004be differ diff --git a/clock/Library/Artifacts/b9/b9d4f7529b211b2396abaeca5ce116f1 b/clock/Library/Artifacts/b9/b9d4f7529b211b2396abaeca5ce116f1 new file mode 100644 index 00000000..8933f54a Binary files /dev/null and b/clock/Library/Artifacts/b9/b9d4f7529b211b2396abaeca5ce116f1 differ diff --git a/clock/Library/Artifacts/b9/b9f64d315caffbf913365ec0aa9db228 b/clock/Library/Artifacts/b9/b9f64d315caffbf913365ec0aa9db228 new file mode 100644 index 00000000..5788281a Binary files /dev/null and b/clock/Library/Artifacts/b9/b9f64d315caffbf913365ec0aa9db228 differ diff --git a/clock/Library/Artifacts/ba/ba695e50005c90e6f7cee8d51038f2a4 b/clock/Library/Artifacts/ba/ba695e50005c90e6f7cee8d51038f2a4 new file mode 100644 index 00000000..b5adf7f6 Binary files /dev/null and b/clock/Library/Artifacts/ba/ba695e50005c90e6f7cee8d51038f2a4 differ diff --git a/clock/Library/Artifacts/bb/bb08dd988e0f3775f6134a10accf232c b/clock/Library/Artifacts/bb/bb08dd988e0f3775f6134a10accf232c new file mode 100644 index 00000000..608ce5fb Binary files /dev/null and b/clock/Library/Artifacts/bb/bb08dd988e0f3775f6134a10accf232c differ diff --git a/clock/Library/Artifacts/bb/bb0ac3050d7c353564dd6d0f1898e3a3 b/clock/Library/Artifacts/bb/bb0ac3050d7c353564dd6d0f1898e3a3 new file mode 100644 index 00000000..c9fce9e0 Binary files /dev/null and b/clock/Library/Artifacts/bb/bb0ac3050d7c353564dd6d0f1898e3a3 differ diff --git a/clock/Library/Artifacts/bb/bb1e5f5fd3608cdf8c46d9ade7fcbc58 b/clock/Library/Artifacts/bb/bb1e5f5fd3608cdf8c46d9ade7fcbc58 new file mode 100644 index 00000000..59afc53f Binary files /dev/null and b/clock/Library/Artifacts/bb/bb1e5f5fd3608cdf8c46d9ade7fcbc58 differ diff --git a/clock/Library/Artifacts/bb/bb26e4e1de701998ebb7b1c5e9639334 b/clock/Library/Artifacts/bb/bb26e4e1de701998ebb7b1c5e9639334 new file mode 100644 index 00000000..b0f35be7 Binary files /dev/null and b/clock/Library/Artifacts/bb/bb26e4e1de701998ebb7b1c5e9639334 differ diff --git a/clock/Library/Artifacts/bb/bb27d6081b45229fd51bbb3d096fb817 b/clock/Library/Artifacts/bb/bb27d6081b45229fd51bbb3d096fb817 new file mode 100644 index 00000000..7a1de11f Binary files /dev/null and b/clock/Library/Artifacts/bb/bb27d6081b45229fd51bbb3d096fb817 differ diff --git a/clock/Library/Artifacts/bb/bb5914454fb50606b7d058a6f2adcce4 b/clock/Library/Artifacts/bb/bb5914454fb50606b7d058a6f2adcce4 new file mode 100644 index 00000000..9df423aa Binary files /dev/null and b/clock/Library/Artifacts/bb/bb5914454fb50606b7d058a6f2adcce4 differ diff --git a/clock/Library/Artifacts/bb/bb8c9576fdd256846209c75de25c97a4 b/clock/Library/Artifacts/bb/bb8c9576fdd256846209c75de25c97a4 new file mode 100644 index 00000000..65e18969 Binary files /dev/null and b/clock/Library/Artifacts/bb/bb8c9576fdd256846209c75de25c97a4 differ diff --git a/clock/Library/Artifacts/bb/bba3c58ae1a18dc8ce70d6416fd661fe b/clock/Library/Artifacts/bb/bba3c58ae1a18dc8ce70d6416fd661fe new file mode 100644 index 00000000..40adcc42 Binary files /dev/null and b/clock/Library/Artifacts/bb/bba3c58ae1a18dc8ce70d6416fd661fe differ diff --git a/clock/Library/Artifacts/bb/bbc8a4df6b156da492e5aaaac0bb9d34 b/clock/Library/Artifacts/bb/bbc8a4df6b156da492e5aaaac0bb9d34 new file mode 100644 index 00000000..72db662c Binary files /dev/null and b/clock/Library/Artifacts/bb/bbc8a4df6b156da492e5aaaac0bb9d34 differ diff --git a/clock/Library/Artifacts/bc/bc726ceae0776861821076de0ef14b03 b/clock/Library/Artifacts/bc/bc726ceae0776861821076de0ef14b03 new file mode 100644 index 00000000..99696147 Binary files /dev/null and b/clock/Library/Artifacts/bc/bc726ceae0776861821076de0ef14b03 differ diff --git a/clock/Library/Artifacts/bc/bc81a08df662d5ae06f683b147c5d41b b/clock/Library/Artifacts/bc/bc81a08df662d5ae06f683b147c5d41b new file mode 100644 index 00000000..4c9f1088 Binary files /dev/null and b/clock/Library/Artifacts/bc/bc81a08df662d5ae06f683b147c5d41b differ diff --git a/clock/Library/Artifacts/bc/bc8b4817e1c56355a651d6408e88cf2f b/clock/Library/Artifacts/bc/bc8b4817e1c56355a651d6408e88cf2f new file mode 100644 index 00000000..c6732587 Binary files /dev/null and b/clock/Library/Artifacts/bc/bc8b4817e1c56355a651d6408e88cf2f differ diff --git a/clock/Library/Artifacts/bc/bcd9614c92487bb03bf2547d0077846f b/clock/Library/Artifacts/bc/bcd9614c92487bb03bf2547d0077846f new file mode 100644 index 00000000..3b8d32c2 Binary files /dev/null and b/clock/Library/Artifacts/bc/bcd9614c92487bb03bf2547d0077846f differ diff --git a/clock/Library/Artifacts/bd/bd0e7f71845a2bc7705f5b0e3a31fb4f b/clock/Library/Artifacts/bd/bd0e7f71845a2bc7705f5b0e3a31fb4f new file mode 100644 index 00000000..859e6c0c Binary files /dev/null and b/clock/Library/Artifacts/bd/bd0e7f71845a2bc7705f5b0e3a31fb4f differ diff --git a/clock/Library/Artifacts/bd/bd2d47745dba1290a985893cc6513d9d b/clock/Library/Artifacts/bd/bd2d47745dba1290a985893cc6513d9d new file mode 100644 index 00000000..9be96ffb Binary files /dev/null and b/clock/Library/Artifacts/bd/bd2d47745dba1290a985893cc6513d9d differ diff --git a/clock/Library/Artifacts/bd/bd6cff8f1e5dda16310e30d7cc4db8fc b/clock/Library/Artifacts/bd/bd6cff8f1e5dda16310e30d7cc4db8fc new file mode 100644 index 00000000..dd60da6b Binary files /dev/null and b/clock/Library/Artifacts/bd/bd6cff8f1e5dda16310e30d7cc4db8fc differ diff --git a/clock/Library/Artifacts/bd/bd6fc79ed7e797aff61ef8a5608c1e44 b/clock/Library/Artifacts/bd/bd6fc79ed7e797aff61ef8a5608c1e44 new file mode 100644 index 00000000..cd884a81 Binary files /dev/null and b/clock/Library/Artifacts/bd/bd6fc79ed7e797aff61ef8a5608c1e44 differ diff --git a/clock/Library/Artifacts/bd/bdd7d63937af367061339119784eb4e4 b/clock/Library/Artifacts/bd/bdd7d63937af367061339119784eb4e4 new file mode 100644 index 00000000..f4b910cf Binary files /dev/null and b/clock/Library/Artifacts/bd/bdd7d63937af367061339119784eb4e4 differ diff --git a/clock/Library/Artifacts/be/be153d10c829abc3964c17ad500ec21c b/clock/Library/Artifacts/be/be153d10c829abc3964c17ad500ec21c new file mode 100644 index 00000000..8b0428e6 Binary files /dev/null and b/clock/Library/Artifacts/be/be153d10c829abc3964c17ad500ec21c differ diff --git a/clock/Library/Artifacts/be/be1fd266060de039cb0f677c8b629e38 b/clock/Library/Artifacts/be/be1fd266060de039cb0f677c8b629e38 new file mode 100644 index 00000000..7665b638 Binary files /dev/null and b/clock/Library/Artifacts/be/be1fd266060de039cb0f677c8b629e38 differ diff --git a/clock/Library/Artifacts/be/be6f929cb426732b837b3e227df90fbf b/clock/Library/Artifacts/be/be6f929cb426732b837b3e227df90fbf new file mode 100644 index 00000000..cfe8c0ea Binary files /dev/null and b/clock/Library/Artifacts/be/be6f929cb426732b837b3e227df90fbf differ diff --git a/clock/Library/Artifacts/be/be9615a2c657eb67e3e7cbf94be7d685 b/clock/Library/Artifacts/be/be9615a2c657eb67e3e7cbf94be7d685 new file mode 100644 index 00000000..2ac58f8c Binary files /dev/null and b/clock/Library/Artifacts/be/be9615a2c657eb67e3e7cbf94be7d685 differ diff --git a/clock/Library/Artifacts/be/beb8f555f48dd334bc88ca57dfffff4a b/clock/Library/Artifacts/be/beb8f555f48dd334bc88ca57dfffff4a new file mode 100644 index 00000000..9badabcd Binary files /dev/null and b/clock/Library/Artifacts/be/beb8f555f48dd334bc88ca57dfffff4a differ diff --git a/clock/Library/Artifacts/bf/bf09da3c16a809b25486e33fbc91df21 b/clock/Library/Artifacts/bf/bf09da3c16a809b25486e33fbc91df21 new file mode 100644 index 00000000..d1cd28ad Binary files /dev/null and b/clock/Library/Artifacts/bf/bf09da3c16a809b25486e33fbc91df21 differ diff --git a/clock/Library/Artifacts/bf/bf36345bbacf92b9d7aa8c87cf88d876 b/clock/Library/Artifacts/bf/bf36345bbacf92b9d7aa8c87cf88d876 new file mode 100644 index 00000000..a3b83106 Binary files /dev/null and b/clock/Library/Artifacts/bf/bf36345bbacf92b9d7aa8c87cf88d876 differ diff --git a/clock/Library/Artifacts/bf/bf5eb9cf57592504a50ce0a6ae9179e8 b/clock/Library/Artifacts/bf/bf5eb9cf57592504a50ce0a6ae9179e8 new file mode 100644 index 00000000..c0d7acab Binary files /dev/null and b/clock/Library/Artifacts/bf/bf5eb9cf57592504a50ce0a6ae9179e8 differ diff --git a/clock/Library/Artifacts/bf/bf9549878f86621baf9f0cd1172df500 b/clock/Library/Artifacts/bf/bf9549878f86621baf9f0cd1172df500 new file mode 100644 index 00000000..0a620488 Binary files /dev/null and b/clock/Library/Artifacts/bf/bf9549878f86621baf9f0cd1172df500 differ diff --git a/clock/Library/Artifacts/bf/bf9bf3e35bae89fdca54c6938e134288 b/clock/Library/Artifacts/bf/bf9bf3e35bae89fdca54c6938e134288 new file mode 100644 index 00000000..a14a5f67 Binary files /dev/null and b/clock/Library/Artifacts/bf/bf9bf3e35bae89fdca54c6938e134288 differ diff --git a/clock/Library/Artifacts/bf/bfb2791aec55fb7fab0b100047d103e9 b/clock/Library/Artifacts/bf/bfb2791aec55fb7fab0b100047d103e9 new file mode 100644 index 00000000..64fc6537 Binary files /dev/null and b/clock/Library/Artifacts/bf/bfb2791aec55fb7fab0b100047d103e9 differ diff --git a/clock/Library/Artifacts/bf/bfb2e60f4460d1a231616e609a3c4f0c b/clock/Library/Artifacts/bf/bfb2e60f4460d1a231616e609a3c4f0c new file mode 100644 index 00000000..892a17d7 Binary files /dev/null and b/clock/Library/Artifacts/bf/bfb2e60f4460d1a231616e609a3c4f0c differ diff --git a/clock/Library/Artifacts/bf/bfcdfd64ac0d6c2a2058652a3ea61f7b b/clock/Library/Artifacts/bf/bfcdfd64ac0d6c2a2058652a3ea61f7b new file mode 100644 index 00000000..c3fd956d Binary files /dev/null and b/clock/Library/Artifacts/bf/bfcdfd64ac0d6c2a2058652a3ea61f7b differ diff --git a/clock/Library/Artifacts/bf/bfe8cb190a2048078e96c3e4185cfd24 b/clock/Library/Artifacts/bf/bfe8cb190a2048078e96c3e4185cfd24 new file mode 100644 index 00000000..e7a06e04 Binary files /dev/null and b/clock/Library/Artifacts/bf/bfe8cb190a2048078e96c3e4185cfd24 differ diff --git a/clock/Library/Artifacts/bf/bff86daef6b2c63405ac8bcbe9eb80eb b/clock/Library/Artifacts/bf/bff86daef6b2c63405ac8bcbe9eb80eb new file mode 100644 index 00000000..bc0d98a6 Binary files /dev/null and b/clock/Library/Artifacts/bf/bff86daef6b2c63405ac8bcbe9eb80eb differ diff --git a/clock/Library/Artifacts/c0/c01d2bf7bb930dd03c4a6223e19d8fae b/clock/Library/Artifacts/c0/c01d2bf7bb930dd03c4a6223e19d8fae new file mode 100644 index 00000000..13cf112e Binary files /dev/null and b/clock/Library/Artifacts/c0/c01d2bf7bb930dd03c4a6223e19d8fae differ diff --git a/clock/Library/Artifacts/c0/c03c5a55edb8174c8a03b88c99f2b204 b/clock/Library/Artifacts/c0/c03c5a55edb8174c8a03b88c99f2b204 new file mode 100644 index 00000000..6cea4ef0 Binary files /dev/null and b/clock/Library/Artifacts/c0/c03c5a55edb8174c8a03b88c99f2b204 differ diff --git a/clock/Library/Artifacts/c0/c04841462e76dbfaf75d2c4b0038b184 b/clock/Library/Artifacts/c0/c04841462e76dbfaf75d2c4b0038b184 new file mode 100644 index 00000000..834ce112 Binary files /dev/null and b/clock/Library/Artifacts/c0/c04841462e76dbfaf75d2c4b0038b184 differ diff --git a/clock/Library/Artifacts/c0/c048f2623cfb3878cfd87024310f1eb7 b/clock/Library/Artifacts/c0/c048f2623cfb3878cfd87024310f1eb7 new file mode 100644 index 00000000..828005b3 Binary files /dev/null and b/clock/Library/Artifacts/c0/c048f2623cfb3878cfd87024310f1eb7 differ diff --git a/clock/Library/Artifacts/c0/c07b20a5c9426250df273cb964c76e37 b/clock/Library/Artifacts/c0/c07b20a5c9426250df273cb964c76e37 new file mode 100644 index 00000000..9c5b5985 Binary files /dev/null and b/clock/Library/Artifacts/c0/c07b20a5c9426250df273cb964c76e37 differ diff --git a/clock/Library/Artifacts/c0/c07ff2d27868698f0affb50c9da87544 b/clock/Library/Artifacts/c0/c07ff2d27868698f0affb50c9da87544 new file mode 100644 index 00000000..e271c4f5 Binary files /dev/null and b/clock/Library/Artifacts/c0/c07ff2d27868698f0affb50c9da87544 differ diff --git a/clock/Library/Artifacts/c0/c09f03f7feb55ac2351681e279fc3925 b/clock/Library/Artifacts/c0/c09f03f7feb55ac2351681e279fc3925 new file mode 100644 index 00000000..47426542 Binary files /dev/null and b/clock/Library/Artifacts/c0/c09f03f7feb55ac2351681e279fc3925 differ diff --git a/clock/Library/Artifacts/c0/c0c25d4d2ade855fd5815b42af5c4a3c b/clock/Library/Artifacts/c0/c0c25d4d2ade855fd5815b42af5c4a3c new file mode 100644 index 00000000..4888b58c Binary files /dev/null and b/clock/Library/Artifacts/c0/c0c25d4d2ade855fd5815b42af5c4a3c differ diff --git a/clock/Library/Artifacts/c0/c0fc1646d5a7a7b2576d50dd24472503 b/clock/Library/Artifacts/c0/c0fc1646d5a7a7b2576d50dd24472503 new file mode 100644 index 00000000..373a4727 Binary files /dev/null and b/clock/Library/Artifacts/c0/c0fc1646d5a7a7b2576d50dd24472503 differ diff --git a/clock/Library/Artifacts/c1/c17a3cd34e6d45414773449e3b45d119 b/clock/Library/Artifacts/c1/c17a3cd34e6d45414773449e3b45d119 new file mode 100644 index 00000000..e4506918 Binary files /dev/null and b/clock/Library/Artifacts/c1/c17a3cd34e6d45414773449e3b45d119 differ diff --git a/clock/Library/Artifacts/c1/c1dd78d29c2f737ee976e3b2de4e6147 b/clock/Library/Artifacts/c1/c1dd78d29c2f737ee976e3b2de4e6147 new file mode 100644 index 00000000..3467c4cc Binary files /dev/null and b/clock/Library/Artifacts/c1/c1dd78d29c2f737ee976e3b2de4e6147 differ diff --git a/clock/Library/Artifacts/c1/c1e1890f661fe346e963bb70a1d53d02 b/clock/Library/Artifacts/c1/c1e1890f661fe346e963bb70a1d53d02 new file mode 100644 index 00000000..4a4ca41e Binary files /dev/null and b/clock/Library/Artifacts/c1/c1e1890f661fe346e963bb70a1d53d02 differ diff --git a/clock/Library/Artifacts/c2/c2391c181699f8620d4bcea8e0e120b5 b/clock/Library/Artifacts/c2/c2391c181699f8620d4bcea8e0e120b5 new file mode 100644 index 00000000..77924903 Binary files /dev/null and b/clock/Library/Artifacts/c2/c2391c181699f8620d4bcea8e0e120b5 differ diff --git a/clock/Library/Artifacts/c2/c259798356833137dd7e42def1aa6167 b/clock/Library/Artifacts/c2/c259798356833137dd7e42def1aa6167 new file mode 100644 index 00000000..b9677b4d Binary files /dev/null and b/clock/Library/Artifacts/c2/c259798356833137dd7e42def1aa6167 differ diff --git a/clock/Library/Artifacts/c2/c25ab474b0b16846ef137f7de7ff7458 b/clock/Library/Artifacts/c2/c25ab474b0b16846ef137f7de7ff7458 new file mode 100644 index 00000000..746b5e5f Binary files /dev/null and b/clock/Library/Artifacts/c2/c25ab474b0b16846ef137f7de7ff7458 differ diff --git a/clock/Library/Artifacts/c2/c25d40aa53d75d427be961b299599ac2 b/clock/Library/Artifacts/c2/c25d40aa53d75d427be961b299599ac2 new file mode 100644 index 00000000..5d66413e Binary files /dev/null and b/clock/Library/Artifacts/c2/c25d40aa53d75d427be961b299599ac2 differ diff --git a/clock/Library/Artifacts/c2/c26a3c42ba120f5c6e0159f0b4d65803 b/clock/Library/Artifacts/c2/c26a3c42ba120f5c6e0159f0b4d65803 new file mode 100644 index 00000000..d0a8eb0c Binary files /dev/null and b/clock/Library/Artifacts/c2/c26a3c42ba120f5c6e0159f0b4d65803 differ diff --git a/clock/Library/Artifacts/c2/c298fbf01e65af189389fc10a76493ba b/clock/Library/Artifacts/c2/c298fbf01e65af189389fc10a76493ba new file mode 100644 index 00000000..b68be17a Binary files /dev/null and b/clock/Library/Artifacts/c2/c298fbf01e65af189389fc10a76493ba differ diff --git a/clock/Library/Artifacts/c2/c2d5e2b84a83bba92ddb08895c5af180 b/clock/Library/Artifacts/c2/c2d5e2b84a83bba92ddb08895c5af180 new file mode 100644 index 00000000..6ed63ba6 Binary files /dev/null and b/clock/Library/Artifacts/c2/c2d5e2b84a83bba92ddb08895c5af180 differ diff --git a/clock/Library/Artifacts/c2/c2e44014197c6cf1e18f30f86396c896 b/clock/Library/Artifacts/c2/c2e44014197c6cf1e18f30f86396c896 new file mode 100644 index 00000000..823530fb Binary files /dev/null and b/clock/Library/Artifacts/c2/c2e44014197c6cf1e18f30f86396c896 differ diff --git a/clock/Library/Artifacts/c3/c3163e9367b5304718c60c47727ec984 b/clock/Library/Artifacts/c3/c3163e9367b5304718c60c47727ec984 new file mode 100644 index 00000000..6a4641d1 Binary files /dev/null and b/clock/Library/Artifacts/c3/c3163e9367b5304718c60c47727ec984 differ diff --git a/clock/Library/Artifacts/c3/c3181cf47327f1d6a23e4ce4b78ef88e b/clock/Library/Artifacts/c3/c3181cf47327f1d6a23e4ce4b78ef88e new file mode 100644 index 00000000..8520adb0 Binary files /dev/null and b/clock/Library/Artifacts/c3/c3181cf47327f1d6a23e4ce4b78ef88e differ diff --git a/clock/Library/Artifacts/c3/c338ef584974d6f38e6307de5f55de79 b/clock/Library/Artifacts/c3/c338ef584974d6f38e6307de5f55de79 new file mode 100644 index 00000000..e6efdb75 Binary files /dev/null and b/clock/Library/Artifacts/c3/c338ef584974d6f38e6307de5f55de79 differ diff --git a/clock/Library/Artifacts/c3/c39779caa1f7580bf827b986c2465d24 b/clock/Library/Artifacts/c3/c39779caa1f7580bf827b986c2465d24 new file mode 100644 index 00000000..d1514642 Binary files /dev/null and b/clock/Library/Artifacts/c3/c39779caa1f7580bf827b986c2465d24 differ diff --git a/clock/Library/Artifacts/c3/c3af1140aab68c8ee7f5ea4e852941d4 b/clock/Library/Artifacts/c3/c3af1140aab68c8ee7f5ea4e852941d4 new file mode 100644 index 00000000..66e09221 Binary files /dev/null and b/clock/Library/Artifacts/c3/c3af1140aab68c8ee7f5ea4e852941d4 differ diff --git a/clock/Library/Artifacts/c4/c41daf4d85ccec2d772c64438bb6a4c3 b/clock/Library/Artifacts/c4/c41daf4d85ccec2d772c64438bb6a4c3 new file mode 100644 index 00000000..96c2d56a Binary files /dev/null and b/clock/Library/Artifacts/c4/c41daf4d85ccec2d772c64438bb6a4c3 differ diff --git a/clock/Library/Artifacts/c4/c445d040cfe1c1f6c088cad69d4fcd4f b/clock/Library/Artifacts/c4/c445d040cfe1c1f6c088cad69d4fcd4f new file mode 100644 index 00000000..5da5782a Binary files /dev/null and b/clock/Library/Artifacts/c4/c445d040cfe1c1f6c088cad69d4fcd4f differ diff --git a/clock/Library/Artifacts/c4/c4490cab8a70695653506c2be83ae687 b/clock/Library/Artifacts/c4/c4490cab8a70695653506c2be83ae687 new file mode 100644 index 00000000..2931c806 Binary files /dev/null and b/clock/Library/Artifacts/c4/c4490cab8a70695653506c2be83ae687 differ diff --git a/clock/Library/Artifacts/c4/c484ad6823b25e7233f1b0c6e54ebad1 b/clock/Library/Artifacts/c4/c484ad6823b25e7233f1b0c6e54ebad1 new file mode 100644 index 00000000..de704a8e Binary files /dev/null and b/clock/Library/Artifacts/c4/c484ad6823b25e7233f1b0c6e54ebad1 differ diff --git a/clock/Library/Artifacts/c4/c48e0e72900367adae53230889fc9ba7 b/clock/Library/Artifacts/c4/c48e0e72900367adae53230889fc9ba7 new file mode 100644 index 00000000..ac642a38 Binary files /dev/null and b/clock/Library/Artifacts/c4/c48e0e72900367adae53230889fc9ba7 differ diff --git a/clock/Library/Artifacts/c5/c5378081cec0b3c00635656fcba22ea7 b/clock/Library/Artifacts/c5/c5378081cec0b3c00635656fcba22ea7 new file mode 100644 index 00000000..99b5f507 Binary files /dev/null and b/clock/Library/Artifacts/c5/c5378081cec0b3c00635656fcba22ea7 differ diff --git a/clock/Library/Artifacts/c5/c55904447f28320d076ca089686e3735 b/clock/Library/Artifacts/c5/c55904447f28320d076ca089686e3735 new file mode 100644 index 00000000..6c27c09e Binary files /dev/null and b/clock/Library/Artifacts/c5/c55904447f28320d076ca089686e3735 differ diff --git a/clock/Library/Artifacts/c5/c57eb5ef013d169e012972d05a2d26f3 b/clock/Library/Artifacts/c5/c57eb5ef013d169e012972d05a2d26f3 new file mode 100644 index 00000000..a99e173c Binary files /dev/null and b/clock/Library/Artifacts/c5/c57eb5ef013d169e012972d05a2d26f3 differ diff --git a/clock/Library/Artifacts/c5/c5c0a8ddfe92a93198578c0419140148 b/clock/Library/Artifacts/c5/c5c0a8ddfe92a93198578c0419140148 new file mode 100644 index 00000000..2751c5ce Binary files /dev/null and b/clock/Library/Artifacts/c5/c5c0a8ddfe92a93198578c0419140148 differ diff --git a/clock/Library/Artifacts/c6/c61414b478f817afa97fb2c2ea8fe48f b/clock/Library/Artifacts/c6/c61414b478f817afa97fb2c2ea8fe48f new file mode 100644 index 00000000..7c3ab0c3 Binary files /dev/null and b/clock/Library/Artifacts/c6/c61414b478f817afa97fb2c2ea8fe48f differ diff --git a/clock/Library/Artifacts/c6/c63263d88608337cb82e5eb5cee5364a b/clock/Library/Artifacts/c6/c63263d88608337cb82e5eb5cee5364a new file mode 100644 index 00000000..db16b2e8 Binary files /dev/null and b/clock/Library/Artifacts/c6/c63263d88608337cb82e5eb5cee5364a differ diff --git a/clock/Library/Artifacts/c6/c6408e6895848df295e64698067bafce b/clock/Library/Artifacts/c6/c6408e6895848df295e64698067bafce new file mode 100644 index 00000000..84ad15c4 Binary files /dev/null and b/clock/Library/Artifacts/c6/c6408e6895848df295e64698067bafce differ diff --git a/clock/Library/Artifacts/c6/c65a4453ee4799328a83abb3f218ab63 b/clock/Library/Artifacts/c6/c65a4453ee4799328a83abb3f218ab63 new file mode 100644 index 00000000..542f9211 Binary files /dev/null and b/clock/Library/Artifacts/c6/c65a4453ee4799328a83abb3f218ab63 differ diff --git a/clock/Library/Artifacts/c6/c67363d3c0b6e202f2a03267404f1fb8 b/clock/Library/Artifacts/c6/c67363d3c0b6e202f2a03267404f1fb8 new file mode 100644 index 00000000..c89505e1 Binary files /dev/null and b/clock/Library/Artifacts/c6/c67363d3c0b6e202f2a03267404f1fb8 differ diff --git a/clock/Library/Artifacts/c6/c687915243e44be481996fe1fcd4a359 b/clock/Library/Artifacts/c6/c687915243e44be481996fe1fcd4a359 new file mode 100644 index 00000000..39e2c066 Binary files /dev/null and b/clock/Library/Artifacts/c6/c687915243e44be481996fe1fcd4a359 differ diff --git a/clock/Library/Artifacts/c6/c6a6e31e8766ec4a5d85d0346d5cd0aa b/clock/Library/Artifacts/c6/c6a6e31e8766ec4a5d85d0346d5cd0aa new file mode 100644 index 00000000..cb939eab Binary files /dev/null and b/clock/Library/Artifacts/c6/c6a6e31e8766ec4a5d85d0346d5cd0aa differ diff --git a/clock/Library/Artifacts/c6/c6bda5ec9c33558c7e6a08502ee35bcf b/clock/Library/Artifacts/c6/c6bda5ec9c33558c7e6a08502ee35bcf new file mode 100644 index 00000000..a99abb04 Binary files /dev/null and b/clock/Library/Artifacts/c6/c6bda5ec9c33558c7e6a08502ee35bcf differ diff --git a/clock/Library/Artifacts/c6/c6c51ddf16d24842895275f7bb23cfcb b/clock/Library/Artifacts/c6/c6c51ddf16d24842895275f7bb23cfcb new file mode 100644 index 00000000..738377ea Binary files /dev/null and b/clock/Library/Artifacts/c6/c6c51ddf16d24842895275f7bb23cfcb differ diff --git a/clock/Library/Artifacts/c7/c707c8d9194452599b544a42348019d1 b/clock/Library/Artifacts/c7/c707c8d9194452599b544a42348019d1 new file mode 100644 index 00000000..0dddd1c8 Binary files /dev/null and b/clock/Library/Artifacts/c7/c707c8d9194452599b544a42348019d1 differ diff --git a/clock/Library/Artifacts/c7/c7527538f19ee986ae10f352742f37c0 b/clock/Library/Artifacts/c7/c7527538f19ee986ae10f352742f37c0 new file mode 100644 index 00000000..f0758331 Binary files /dev/null and b/clock/Library/Artifacts/c7/c7527538f19ee986ae10f352742f37c0 differ diff --git a/clock/Library/Artifacts/c7/c753fe79332118a3a26d31523549e50f b/clock/Library/Artifacts/c7/c753fe79332118a3a26d31523549e50f new file mode 100644 index 00000000..a9edc4ea Binary files /dev/null and b/clock/Library/Artifacts/c7/c753fe79332118a3a26d31523549e50f differ diff --git a/clock/Library/Artifacts/c7/c79b5af2f5461fb5ead892846992d321 b/clock/Library/Artifacts/c7/c79b5af2f5461fb5ead892846992d321 new file mode 100644 index 00000000..6cc6dadf Binary files /dev/null and b/clock/Library/Artifacts/c7/c79b5af2f5461fb5ead892846992d321 differ diff --git a/clock/Library/Artifacts/c7/c7b746e12dc7c9bb1949135db80d0bb2 b/clock/Library/Artifacts/c7/c7b746e12dc7c9bb1949135db80d0bb2 new file mode 100644 index 00000000..c2508059 Binary files /dev/null and b/clock/Library/Artifacts/c7/c7b746e12dc7c9bb1949135db80d0bb2 differ diff --git a/clock/Library/Artifacts/c7/c7b981b060c67b639af083577bc6e02e b/clock/Library/Artifacts/c7/c7b981b060c67b639af083577bc6e02e new file mode 100644 index 00000000..9f61e89b Binary files /dev/null and b/clock/Library/Artifacts/c7/c7b981b060c67b639af083577bc6e02e differ diff --git a/clock/Library/Artifacts/c7/c7c1713f9e86340b67a749132cdef71c b/clock/Library/Artifacts/c7/c7c1713f9e86340b67a749132cdef71c new file mode 100644 index 00000000..a857f818 Binary files /dev/null and b/clock/Library/Artifacts/c7/c7c1713f9e86340b67a749132cdef71c differ diff --git a/clock/Library/Artifacts/c7/c7c3d71405630c3fcce3faed766506cc b/clock/Library/Artifacts/c7/c7c3d71405630c3fcce3faed766506cc new file mode 100644 index 00000000..af1deaf9 Binary files /dev/null and b/clock/Library/Artifacts/c7/c7c3d71405630c3fcce3faed766506cc differ diff --git a/clock/Library/Artifacts/c8/c82fdf3e45a81f8b6edd337a3f11106a b/clock/Library/Artifacts/c8/c82fdf3e45a81f8b6edd337a3f11106a new file mode 100644 index 00000000..9021dda3 Binary files /dev/null and b/clock/Library/Artifacts/c8/c82fdf3e45a81f8b6edd337a3f11106a differ diff --git a/clock/Library/Artifacts/c8/c84344b929603a5056ef45dac447e6a4 b/clock/Library/Artifacts/c8/c84344b929603a5056ef45dac447e6a4 new file mode 100644 index 00000000..6e761daa Binary files /dev/null and b/clock/Library/Artifacts/c8/c84344b929603a5056ef45dac447e6a4 differ diff --git a/clock/Library/Artifacts/c8/c86776918be37e3330c1b05081b37035 b/clock/Library/Artifacts/c8/c86776918be37e3330c1b05081b37035 new file mode 100644 index 00000000..dde01f7d Binary files /dev/null and b/clock/Library/Artifacts/c8/c86776918be37e3330c1b05081b37035 differ diff --git a/clock/Library/Artifacts/c9/c9515859b3246e8961580d201b379467 b/clock/Library/Artifacts/c9/c9515859b3246e8961580d201b379467 new file mode 100644 index 00000000..34a5cd8b Binary files /dev/null and b/clock/Library/Artifacts/c9/c9515859b3246e8961580d201b379467 differ diff --git a/clock/Library/Artifacts/c9/c95e0a845f29964bb47c8402a55b5628 b/clock/Library/Artifacts/c9/c95e0a845f29964bb47c8402a55b5628 new file mode 100644 index 00000000..d8b116cc Binary files /dev/null and b/clock/Library/Artifacts/c9/c95e0a845f29964bb47c8402a55b5628 differ diff --git a/clock/Library/Artifacts/c9/c994b244535b9dd46b9b5db2cddfd79b b/clock/Library/Artifacts/c9/c994b244535b9dd46b9b5db2cddfd79b new file mode 100644 index 00000000..bc6146b6 Binary files /dev/null and b/clock/Library/Artifacts/c9/c994b244535b9dd46b9b5db2cddfd79b differ diff --git a/clock/Library/Artifacts/c9/c9a284aa07aaa4af37fa2a6ee47241b2 b/clock/Library/Artifacts/c9/c9a284aa07aaa4af37fa2a6ee47241b2 new file mode 100644 index 00000000..a7c4126b Binary files /dev/null and b/clock/Library/Artifacts/c9/c9a284aa07aaa4af37fa2a6ee47241b2 differ diff --git a/clock/Library/Artifacts/c9/c9c676058b9d43b8d2704601c68cf21a b/clock/Library/Artifacts/c9/c9c676058b9d43b8d2704601c68cf21a new file mode 100644 index 00000000..68daecdc Binary files /dev/null and b/clock/Library/Artifacts/c9/c9c676058b9d43b8d2704601c68cf21a differ diff --git a/clock/Library/Artifacts/ca/ca0dfdce9a45b169de8c0f67fede1d0c b/clock/Library/Artifacts/ca/ca0dfdce9a45b169de8c0f67fede1d0c new file mode 100644 index 00000000..71574a8a Binary files /dev/null and b/clock/Library/Artifacts/ca/ca0dfdce9a45b169de8c0f67fede1d0c differ diff --git a/clock/Library/Artifacts/ca/ca0ef668f9cf4a1f04e325469681d6bf b/clock/Library/Artifacts/ca/ca0ef668f9cf4a1f04e325469681d6bf new file mode 100644 index 00000000..a0bf88dd Binary files /dev/null and b/clock/Library/Artifacts/ca/ca0ef668f9cf4a1f04e325469681d6bf differ diff --git a/clock/Library/Artifacts/ca/ca2a8cd50b10a92ccbb52d882fc4e50e b/clock/Library/Artifacts/ca/ca2a8cd50b10a92ccbb52d882fc4e50e new file mode 100644 index 00000000..f444109d Binary files /dev/null and b/clock/Library/Artifacts/ca/ca2a8cd50b10a92ccbb52d882fc4e50e differ diff --git a/clock/Library/Artifacts/ca/ca3c88db3f93f2ae8f5b4eaafa144bf0 b/clock/Library/Artifacts/ca/ca3c88db3f93f2ae8f5b4eaafa144bf0 new file mode 100644 index 00000000..5d490862 Binary files /dev/null and b/clock/Library/Artifacts/ca/ca3c88db3f93f2ae8f5b4eaafa144bf0 differ diff --git a/clock/Library/Artifacts/ca/ca4de5b7044b4279c5dfdf824fcd4218 b/clock/Library/Artifacts/ca/ca4de5b7044b4279c5dfdf824fcd4218 new file mode 100644 index 00000000..7d80c6aa Binary files /dev/null and b/clock/Library/Artifacts/ca/ca4de5b7044b4279c5dfdf824fcd4218 differ diff --git a/clock/Library/Artifacts/ca/caf87c61e5aa6acf01706f2fdb5f7b84 b/clock/Library/Artifacts/ca/caf87c61e5aa6acf01706f2fdb5f7b84 new file mode 100644 index 00000000..77da78f3 Binary files /dev/null and b/clock/Library/Artifacts/ca/caf87c61e5aa6acf01706f2fdb5f7b84 differ diff --git a/clock/Library/Artifacts/cb/cb0d8ed0e094780bc00a61beab15e04e b/clock/Library/Artifacts/cb/cb0d8ed0e094780bc00a61beab15e04e new file mode 100644 index 00000000..b24a28f6 Binary files /dev/null and b/clock/Library/Artifacts/cb/cb0d8ed0e094780bc00a61beab15e04e differ diff --git a/clock/Library/Artifacts/cb/cb53186071960131173e1d0c56e7696b b/clock/Library/Artifacts/cb/cb53186071960131173e1d0c56e7696b new file mode 100644 index 00000000..b0fdabfc Binary files /dev/null and b/clock/Library/Artifacts/cb/cb53186071960131173e1d0c56e7696b differ diff --git a/clock/Library/Artifacts/cb/cb58047be4020826d407a9535b4ee9c3 b/clock/Library/Artifacts/cb/cb58047be4020826d407a9535b4ee9c3 new file mode 100644 index 00000000..b28041e9 Binary files /dev/null and b/clock/Library/Artifacts/cb/cb58047be4020826d407a9535b4ee9c3 differ diff --git a/clock/Library/Artifacts/cb/cb5fdfc89320aa55d280390939d7a3ec b/clock/Library/Artifacts/cb/cb5fdfc89320aa55d280390939d7a3ec new file mode 100644 index 00000000..b3466ee8 Binary files /dev/null and b/clock/Library/Artifacts/cb/cb5fdfc89320aa55d280390939d7a3ec differ diff --git a/clock/Library/Artifacts/cb/cb8c48ecb6ff36e31f577f04eb18fe67 b/clock/Library/Artifacts/cb/cb8c48ecb6ff36e31f577f04eb18fe67 new file mode 100644 index 00000000..26804c19 Binary files /dev/null and b/clock/Library/Artifacts/cb/cb8c48ecb6ff36e31f577f04eb18fe67 differ diff --git a/clock/Library/Artifacts/cb/cbae3560326b96c5ef1e7dd3540a7b94 b/clock/Library/Artifacts/cb/cbae3560326b96c5ef1e7dd3540a7b94 new file mode 100644 index 00000000..ff535210 Binary files /dev/null and b/clock/Library/Artifacts/cb/cbae3560326b96c5ef1e7dd3540a7b94 differ diff --git a/clock/Library/Artifacts/cb/cbdec08073d94f97ee6acda513f590fb b/clock/Library/Artifacts/cb/cbdec08073d94f97ee6acda513f590fb new file mode 100644 index 00000000..8d862f57 Binary files /dev/null and b/clock/Library/Artifacts/cb/cbdec08073d94f97ee6acda513f590fb differ diff --git a/clock/Library/Artifacts/cb/cbeceee25eccdda1eb8af837b7a995a8 b/clock/Library/Artifacts/cb/cbeceee25eccdda1eb8af837b7a995a8 new file mode 100644 index 00000000..0ae67872 Binary files /dev/null and b/clock/Library/Artifacts/cb/cbeceee25eccdda1eb8af837b7a995a8 differ diff --git a/clock/Library/Artifacts/cb/cbf3a01174425e5588e4ba1c62766f8d b/clock/Library/Artifacts/cb/cbf3a01174425e5588e4ba1c62766f8d new file mode 100644 index 00000000..4f01d3e8 Binary files /dev/null and b/clock/Library/Artifacts/cb/cbf3a01174425e5588e4ba1c62766f8d differ diff --git a/clock/Library/Artifacts/cb/cbfe9ba4c8a26514b2923d63a454ec65 b/clock/Library/Artifacts/cb/cbfe9ba4c8a26514b2923d63a454ec65 new file mode 100644 index 00000000..a779e020 Binary files /dev/null and b/clock/Library/Artifacts/cb/cbfe9ba4c8a26514b2923d63a454ec65 differ diff --git a/clock/Library/Artifacts/cc/cc21d2066dd6675a43b5175c5285f2de b/clock/Library/Artifacts/cc/cc21d2066dd6675a43b5175c5285f2de new file mode 100644 index 00000000..b05ce8c4 Binary files /dev/null and b/clock/Library/Artifacts/cc/cc21d2066dd6675a43b5175c5285f2de differ diff --git a/clock/Library/Artifacts/cc/cc4cc4bdd57146f93401fc7446e12888 b/clock/Library/Artifacts/cc/cc4cc4bdd57146f93401fc7446e12888 new file mode 100644 index 00000000..48be7d0f Binary files /dev/null and b/clock/Library/Artifacts/cc/cc4cc4bdd57146f93401fc7446e12888 differ diff --git a/clock/Library/Artifacts/cc/cc6a2bce5a823e383525547183d7d1a3 b/clock/Library/Artifacts/cc/cc6a2bce5a823e383525547183d7d1a3 new file mode 100644 index 00000000..5c9a8cb6 Binary files /dev/null and b/clock/Library/Artifacts/cc/cc6a2bce5a823e383525547183d7d1a3 differ diff --git a/clock/Library/Artifacts/cc/cc7c478ebe00b1fcaaf6ed0db0755563 b/clock/Library/Artifacts/cc/cc7c478ebe00b1fcaaf6ed0db0755563 new file mode 100644 index 00000000..ab7f56f2 Binary files /dev/null and b/clock/Library/Artifacts/cc/cc7c478ebe00b1fcaaf6ed0db0755563 differ diff --git a/clock/Library/Artifacts/cc/cca619dfdbeb025becc3af04432173a1 b/clock/Library/Artifacts/cc/cca619dfdbeb025becc3af04432173a1 new file mode 100644 index 00000000..cf1fb145 Binary files /dev/null and b/clock/Library/Artifacts/cc/cca619dfdbeb025becc3af04432173a1 differ diff --git a/clock/Library/Artifacts/cd/cd09abf6fedca002279dd92b45c97508 b/clock/Library/Artifacts/cd/cd09abf6fedca002279dd92b45c97508 new file mode 100644 index 00000000..dba23cb5 Binary files /dev/null and b/clock/Library/Artifacts/cd/cd09abf6fedca002279dd92b45c97508 differ diff --git a/clock/Library/Artifacts/cd/cd265772a6df899c1513c9340612968b b/clock/Library/Artifacts/cd/cd265772a6df899c1513c9340612968b new file mode 100644 index 00000000..71997dae Binary files /dev/null and b/clock/Library/Artifacts/cd/cd265772a6df899c1513c9340612968b differ diff --git a/clock/Library/Artifacts/cd/cd7b0937451a75510cf9cf5389df103a b/clock/Library/Artifacts/cd/cd7b0937451a75510cf9cf5389df103a new file mode 100644 index 00000000..6ed33928 Binary files /dev/null and b/clock/Library/Artifacts/cd/cd7b0937451a75510cf9cf5389df103a differ diff --git a/clock/Library/Artifacts/cd/cd91471a89b512e57a75f68430a9279b b/clock/Library/Artifacts/cd/cd91471a89b512e57a75f68430a9279b new file mode 100644 index 00000000..a34d2cba Binary files /dev/null and b/clock/Library/Artifacts/cd/cd91471a89b512e57a75f68430a9279b differ diff --git a/clock/Library/Artifacts/cd/cdc4976a6561bafac0151d7b0874bbeb b/clock/Library/Artifacts/cd/cdc4976a6561bafac0151d7b0874bbeb new file mode 100644 index 00000000..1d7cff7c Binary files /dev/null and b/clock/Library/Artifacts/cd/cdc4976a6561bafac0151d7b0874bbeb differ diff --git a/clock/Library/Artifacts/cd/cdd06ca54553a0cbe49f4fb2f15a25d3 b/clock/Library/Artifacts/cd/cdd06ca54553a0cbe49f4fb2f15a25d3 new file mode 100644 index 00000000..d8731b73 Binary files /dev/null and b/clock/Library/Artifacts/cd/cdd06ca54553a0cbe49f4fb2f15a25d3 differ diff --git a/clock/Library/Artifacts/ce/ce2585fd83bfd1b7916cdfec0ae495fb b/clock/Library/Artifacts/ce/ce2585fd83bfd1b7916cdfec0ae495fb new file mode 100644 index 00000000..4c422d4c Binary files /dev/null and b/clock/Library/Artifacts/ce/ce2585fd83bfd1b7916cdfec0ae495fb differ diff --git a/clock/Library/Artifacts/ce/ce4ffd46de4e6148d4cc17d33ee87b0c b/clock/Library/Artifacts/ce/ce4ffd46de4e6148d4cc17d33ee87b0c new file mode 100644 index 00000000..3b27ba36 Binary files /dev/null and b/clock/Library/Artifacts/ce/ce4ffd46de4e6148d4cc17d33ee87b0c differ diff --git a/clock/Library/Artifacts/ce/ce940a75367af3d305fa327e55101cba b/clock/Library/Artifacts/ce/ce940a75367af3d305fa327e55101cba new file mode 100644 index 00000000..f16e0689 Binary files /dev/null and b/clock/Library/Artifacts/ce/ce940a75367af3d305fa327e55101cba differ diff --git a/clock/Library/Artifacts/ce/ceb7eafb0bff960b21c283088fc47a52 b/clock/Library/Artifacts/ce/ceb7eafb0bff960b21c283088fc47a52 new file mode 100644 index 00000000..0f8e0d6e Binary files /dev/null and b/clock/Library/Artifacts/ce/ceb7eafb0bff960b21c283088fc47a52 differ diff --git a/clock/Library/Artifacts/cf/cf0ce77db6c699a71f19710fcfa1e0cc b/clock/Library/Artifacts/cf/cf0ce77db6c699a71f19710fcfa1e0cc new file mode 100644 index 00000000..a3c8f8f6 Binary files /dev/null and b/clock/Library/Artifacts/cf/cf0ce77db6c699a71f19710fcfa1e0cc differ diff --git a/clock/Library/Artifacts/cf/cf31df28d5940b62bbf06014fb28d593 b/clock/Library/Artifacts/cf/cf31df28d5940b62bbf06014fb28d593 new file mode 100644 index 00000000..db8870e4 Binary files /dev/null and b/clock/Library/Artifacts/cf/cf31df28d5940b62bbf06014fb28d593 differ diff --git a/clock/Library/Artifacts/cf/cf53c307e46f29b0c9e38e6d367f4d2a b/clock/Library/Artifacts/cf/cf53c307e46f29b0c9e38e6d367f4d2a new file mode 100644 index 00000000..dcc06323 Binary files /dev/null and b/clock/Library/Artifacts/cf/cf53c307e46f29b0c9e38e6d367f4d2a differ diff --git a/clock/Library/Artifacts/cf/cf86261666cf904f66f90197fb144341 b/clock/Library/Artifacts/cf/cf86261666cf904f66f90197fb144341 new file mode 100644 index 00000000..4c039365 Binary files /dev/null and b/clock/Library/Artifacts/cf/cf86261666cf904f66f90197fb144341 differ diff --git a/clock/Library/Artifacts/cf/cf9803c38e2941a361f0ac21f268732e b/clock/Library/Artifacts/cf/cf9803c38e2941a361f0ac21f268732e new file mode 100644 index 00000000..9a6cfba2 Binary files /dev/null and b/clock/Library/Artifacts/cf/cf9803c38e2941a361f0ac21f268732e differ diff --git a/clock/Library/Artifacts/cf/cff1e730cdad1c0cb80de933cb316bff b/clock/Library/Artifacts/cf/cff1e730cdad1c0cb80de933cb316bff new file mode 100644 index 00000000..9c443e05 Binary files /dev/null and b/clock/Library/Artifacts/cf/cff1e730cdad1c0cb80de933cb316bff differ diff --git a/clock/Library/Artifacts/d0/d01fda28f26c582b5cfecf57b63ab2d1 b/clock/Library/Artifacts/d0/d01fda28f26c582b5cfecf57b63ab2d1 new file mode 100644 index 00000000..f8c001e4 Binary files /dev/null and b/clock/Library/Artifacts/d0/d01fda28f26c582b5cfecf57b63ab2d1 differ diff --git a/clock/Library/Artifacts/d0/d02684648ff31917380e0f82cb6788ad b/clock/Library/Artifacts/d0/d02684648ff31917380e0f82cb6788ad new file mode 100644 index 00000000..ccf87096 Binary files /dev/null and b/clock/Library/Artifacts/d0/d02684648ff31917380e0f82cb6788ad differ diff --git a/clock/Library/Artifacts/d0/d042e538ee0a6581810dcda046e10b9b b/clock/Library/Artifacts/d0/d042e538ee0a6581810dcda046e10b9b new file mode 100644 index 00000000..28e6ad3c Binary files /dev/null and b/clock/Library/Artifacts/d0/d042e538ee0a6581810dcda046e10b9b differ diff --git a/clock/Library/Artifacts/d0/d071292bed4ad244d6523c49f8ad0c59 b/clock/Library/Artifacts/d0/d071292bed4ad244d6523c49f8ad0c59 new file mode 100644 index 00000000..33ea5c2a Binary files /dev/null and b/clock/Library/Artifacts/d0/d071292bed4ad244d6523c49f8ad0c59 differ diff --git a/clock/Library/Artifacts/d0/d0a343d26817df674beba49f9695f5d3 b/clock/Library/Artifacts/d0/d0a343d26817df674beba49f9695f5d3 new file mode 100644 index 00000000..347d7bf5 Binary files /dev/null and b/clock/Library/Artifacts/d0/d0a343d26817df674beba49f9695f5d3 differ diff --git a/clock/Library/Artifacts/d0/d0fe325211924bf638ecc1e130598ce3 b/clock/Library/Artifacts/d0/d0fe325211924bf638ecc1e130598ce3 new file mode 100644 index 00000000..6f107c91 Binary files /dev/null and b/clock/Library/Artifacts/d0/d0fe325211924bf638ecc1e130598ce3 differ diff --git a/clock/Library/Artifacts/d1/d1069ef3a8c1e6882bec784d846cba39 b/clock/Library/Artifacts/d1/d1069ef3a8c1e6882bec784d846cba39 new file mode 100644 index 00000000..9fb45c20 Binary files /dev/null and b/clock/Library/Artifacts/d1/d1069ef3a8c1e6882bec784d846cba39 differ diff --git a/clock/Library/Artifacts/d1/d1327a68d159a77c34c42da0be1e9e5c b/clock/Library/Artifacts/d1/d1327a68d159a77c34c42da0be1e9e5c new file mode 100644 index 00000000..d29c2657 Binary files /dev/null and b/clock/Library/Artifacts/d1/d1327a68d159a77c34c42da0be1e9e5c differ diff --git a/clock/Library/Artifacts/d1/d14e2a90ebdd1e85914a2a15d8283986 b/clock/Library/Artifacts/d1/d14e2a90ebdd1e85914a2a15d8283986 new file mode 100644 index 00000000..b6cc0383 Binary files /dev/null and b/clock/Library/Artifacts/d1/d14e2a90ebdd1e85914a2a15d8283986 differ diff --git a/clock/Library/Artifacts/d1/d1a28e286677f54be782d1102cf97055 b/clock/Library/Artifacts/d1/d1a28e286677f54be782d1102cf97055 new file mode 100644 index 00000000..488ea10e Binary files /dev/null and b/clock/Library/Artifacts/d1/d1a28e286677f54be782d1102cf97055 differ diff --git a/clock/Library/Artifacts/d1/d1c5710140c337d654f4b1307fb895b4 b/clock/Library/Artifacts/d1/d1c5710140c337d654f4b1307fb895b4 new file mode 100644 index 00000000..19cf9a80 Binary files /dev/null and b/clock/Library/Artifacts/d1/d1c5710140c337d654f4b1307fb895b4 differ diff --git a/clock/Library/Artifacts/d2/d26f91587b3ec933e50bbc4e7385261c b/clock/Library/Artifacts/d2/d26f91587b3ec933e50bbc4e7385261c new file mode 100644 index 00000000..89e821cb Binary files /dev/null and b/clock/Library/Artifacts/d2/d26f91587b3ec933e50bbc4e7385261c differ diff --git a/clock/Library/Artifacts/d3/d3029d328a8660a82ff0a93faece8c85 b/clock/Library/Artifacts/d3/d3029d328a8660a82ff0a93faece8c85 new file mode 100644 index 00000000..206f5bd7 Binary files /dev/null and b/clock/Library/Artifacts/d3/d3029d328a8660a82ff0a93faece8c85 differ diff --git a/clock/Library/Artifacts/d3/d30690e8ac0d16d25a5f5eb7f3eeb7b0 b/clock/Library/Artifacts/d3/d30690e8ac0d16d25a5f5eb7f3eeb7b0 new file mode 100644 index 00000000..2146ddf8 Binary files /dev/null and b/clock/Library/Artifacts/d3/d30690e8ac0d16d25a5f5eb7f3eeb7b0 differ diff --git a/clock/Library/Artifacts/d3/d33a01aeee9c2ca61ccf7cb27132353f b/clock/Library/Artifacts/d3/d33a01aeee9c2ca61ccf7cb27132353f new file mode 100644 index 00000000..1dadc5ee Binary files /dev/null and b/clock/Library/Artifacts/d3/d33a01aeee9c2ca61ccf7cb27132353f differ diff --git a/clock/Library/Artifacts/d3/d375ce40cf94a8501c0c0ef67102f15d b/clock/Library/Artifacts/d3/d375ce40cf94a8501c0c0ef67102f15d new file mode 100644 index 00000000..d308c29e Binary files /dev/null and b/clock/Library/Artifacts/d3/d375ce40cf94a8501c0c0ef67102f15d differ diff --git a/clock/Library/Artifacts/d3/d3b4bfb7c70938c224a6491993847391 b/clock/Library/Artifacts/d3/d3b4bfb7c70938c224a6491993847391 new file mode 100644 index 00000000..cb48b567 Binary files /dev/null and b/clock/Library/Artifacts/d3/d3b4bfb7c70938c224a6491993847391 differ diff --git a/clock/Library/Artifacts/d4/d40f57679420e867dc83ca5f60a59466 b/clock/Library/Artifacts/d4/d40f57679420e867dc83ca5f60a59466 new file mode 100644 index 00000000..75ec2831 Binary files /dev/null and b/clock/Library/Artifacts/d4/d40f57679420e867dc83ca5f60a59466 differ diff --git a/clock/Library/Artifacts/d4/d436bdcf7450213e934190a2117d9251 b/clock/Library/Artifacts/d4/d436bdcf7450213e934190a2117d9251 new file mode 100644 index 00000000..f3909a2b Binary files /dev/null and b/clock/Library/Artifacts/d4/d436bdcf7450213e934190a2117d9251 differ diff --git a/clock/Library/Artifacts/d4/d4a4740c80e5ce754bc7b076ab8a2199 b/clock/Library/Artifacts/d4/d4a4740c80e5ce754bc7b076ab8a2199 new file mode 100644 index 00000000..7a06ede8 Binary files /dev/null and b/clock/Library/Artifacts/d4/d4a4740c80e5ce754bc7b076ab8a2199 differ diff --git a/clock/Library/Artifacts/d4/d4afc3b549146d80340a248ac9911f6c b/clock/Library/Artifacts/d4/d4afc3b549146d80340a248ac9911f6c new file mode 100644 index 00000000..fa08e3ea Binary files /dev/null and b/clock/Library/Artifacts/d4/d4afc3b549146d80340a248ac9911f6c differ diff --git a/clock/Library/Artifacts/d4/d4e2547b82b32d8396f1c6ccab964ae8 b/clock/Library/Artifacts/d4/d4e2547b82b32d8396f1c6ccab964ae8 new file mode 100644 index 00000000..ac1391f3 Binary files /dev/null and b/clock/Library/Artifacts/d4/d4e2547b82b32d8396f1c6ccab964ae8 differ diff --git a/clock/Library/Artifacts/d5/d5552e907c2fe159ed54234308b5628d b/clock/Library/Artifacts/d5/d5552e907c2fe159ed54234308b5628d new file mode 100644 index 00000000..ae0f5cb0 Binary files /dev/null and b/clock/Library/Artifacts/d5/d5552e907c2fe159ed54234308b5628d differ diff --git a/clock/Library/Artifacts/d5/d575e1921d0a66dd62d0cbea59935d0f b/clock/Library/Artifacts/d5/d575e1921d0a66dd62d0cbea59935d0f new file mode 100644 index 00000000..f41be0fd Binary files /dev/null and b/clock/Library/Artifacts/d5/d575e1921d0a66dd62d0cbea59935d0f differ diff --git a/clock/Library/Artifacts/d5/d59923bdc4066cbfcdcbe76ad7f3414e b/clock/Library/Artifacts/d5/d59923bdc4066cbfcdcbe76ad7f3414e new file mode 100644 index 00000000..9d43e393 Binary files /dev/null and b/clock/Library/Artifacts/d5/d59923bdc4066cbfcdcbe76ad7f3414e differ diff --git a/clock/Library/Artifacts/d5/d5b3c4bc35dac1b0c5ab99c9d3bb657d b/clock/Library/Artifacts/d5/d5b3c4bc35dac1b0c5ab99c9d3bb657d new file mode 100644 index 00000000..b7bd60da Binary files /dev/null and b/clock/Library/Artifacts/d5/d5b3c4bc35dac1b0c5ab99c9d3bb657d differ diff --git a/clock/Library/Artifacts/d5/d5e061a64993e7cb866d413575a55735 b/clock/Library/Artifacts/d5/d5e061a64993e7cb866d413575a55735 new file mode 100644 index 00000000..417fe4cd Binary files /dev/null and b/clock/Library/Artifacts/d5/d5e061a64993e7cb866d413575a55735 differ diff --git a/clock/Library/Artifacts/d5/d5f438b797a4535f99371fc46aba1107 b/clock/Library/Artifacts/d5/d5f438b797a4535f99371fc46aba1107 new file mode 100644 index 00000000..d89ac726 Binary files /dev/null and b/clock/Library/Artifacts/d5/d5f438b797a4535f99371fc46aba1107 differ diff --git a/clock/Library/Artifacts/d6/d642ef0faa69e53062720ffc7e38948e b/clock/Library/Artifacts/d6/d642ef0faa69e53062720ffc7e38948e new file mode 100644 index 00000000..880ba2c0 Binary files /dev/null and b/clock/Library/Artifacts/d6/d642ef0faa69e53062720ffc7e38948e differ diff --git a/clock/Library/Artifacts/d6/d65176aaa111fac445978f5b04167493 b/clock/Library/Artifacts/d6/d65176aaa111fac445978f5b04167493 new file mode 100644 index 00000000..f963e4e9 Binary files /dev/null and b/clock/Library/Artifacts/d6/d65176aaa111fac445978f5b04167493 differ diff --git a/clock/Library/Artifacts/d6/d67b171fa28159a60eaec52061ccf54c b/clock/Library/Artifacts/d6/d67b171fa28159a60eaec52061ccf54c new file mode 100644 index 00000000..f6e4aaaa Binary files /dev/null and b/clock/Library/Artifacts/d6/d67b171fa28159a60eaec52061ccf54c differ diff --git a/clock/Library/Artifacts/d6/d682b7596cbda0b38927733530bc4c6f b/clock/Library/Artifacts/d6/d682b7596cbda0b38927733530bc4c6f new file mode 100644 index 00000000..76b8775d Binary files /dev/null and b/clock/Library/Artifacts/d6/d682b7596cbda0b38927733530bc4c6f differ diff --git a/clock/Library/Artifacts/d6/d6dbd245213a493a59f69dfe7fc1a721 b/clock/Library/Artifacts/d6/d6dbd245213a493a59f69dfe7fc1a721 new file mode 100644 index 00000000..8df0915f Binary files /dev/null and b/clock/Library/Artifacts/d6/d6dbd245213a493a59f69dfe7fc1a721 differ diff --git a/clock/Library/Artifacts/d6/d6e09af61374afe9340d7538174f8556 b/clock/Library/Artifacts/d6/d6e09af61374afe9340d7538174f8556 new file mode 100644 index 00000000..a9955b97 Binary files /dev/null and b/clock/Library/Artifacts/d6/d6e09af61374afe9340d7538174f8556 differ diff --git a/clock/Library/Artifacts/d7/d749c6031e0d7042376747ac8813c589 b/clock/Library/Artifacts/d7/d749c6031e0d7042376747ac8813c589 new file mode 100644 index 00000000..0ef3f938 Binary files /dev/null and b/clock/Library/Artifacts/d7/d749c6031e0d7042376747ac8813c589 differ diff --git a/clock/Library/Artifacts/d7/d7cb1d20710b07487aebfcef0f9d8d77 b/clock/Library/Artifacts/d7/d7cb1d20710b07487aebfcef0f9d8d77 new file mode 100644 index 00000000..3f65bfe0 Binary files /dev/null and b/clock/Library/Artifacts/d7/d7cb1d20710b07487aebfcef0f9d8d77 differ diff --git a/clock/Library/Artifacts/d7/d7e4b8da864123fc3e27fa1d7eef1aa7 b/clock/Library/Artifacts/d7/d7e4b8da864123fc3e27fa1d7eef1aa7 new file mode 100644 index 00000000..b6c9035c Binary files /dev/null and b/clock/Library/Artifacts/d7/d7e4b8da864123fc3e27fa1d7eef1aa7 differ diff --git a/clock/Library/Artifacts/d7/d7f245247d14e58411f48fd66da6b750 b/clock/Library/Artifacts/d7/d7f245247d14e58411f48fd66da6b750 new file mode 100644 index 00000000..d2abf2fd Binary files /dev/null and b/clock/Library/Artifacts/d7/d7f245247d14e58411f48fd66da6b750 differ diff --git a/clock/Library/Artifacts/d7/d7ff6545ae60b82f27a0a9230cd407c5 b/clock/Library/Artifacts/d7/d7ff6545ae60b82f27a0a9230cd407c5 new file mode 100644 index 00000000..4a23cf83 Binary files /dev/null and b/clock/Library/Artifacts/d7/d7ff6545ae60b82f27a0a9230cd407c5 differ diff --git a/clock/Library/Artifacts/d8/d816a0334ec5a8bce5799fce847e8ccf b/clock/Library/Artifacts/d8/d816a0334ec5a8bce5799fce847e8ccf new file mode 100644 index 00000000..bf01a94d Binary files /dev/null and b/clock/Library/Artifacts/d8/d816a0334ec5a8bce5799fce847e8ccf differ diff --git a/clock/Library/Artifacts/d8/d81b5e5f9ffda80585ca690d29f2d9d5 b/clock/Library/Artifacts/d8/d81b5e5f9ffda80585ca690d29f2d9d5 new file mode 100644 index 00000000..56222579 Binary files /dev/null and b/clock/Library/Artifacts/d8/d81b5e5f9ffda80585ca690d29f2d9d5 differ diff --git a/clock/Library/Artifacts/d8/d83005c5136d9f453533bf2671baff24 b/clock/Library/Artifacts/d8/d83005c5136d9f453533bf2671baff24 new file mode 100644 index 00000000..9a92fb2e Binary files /dev/null and b/clock/Library/Artifacts/d8/d83005c5136d9f453533bf2671baff24 differ diff --git a/clock/Library/Artifacts/d8/d89159d23d3b73b56f445e6097890970 b/clock/Library/Artifacts/d8/d89159d23d3b73b56f445e6097890970 new file mode 100644 index 00000000..8ba07435 Binary files /dev/null and b/clock/Library/Artifacts/d8/d89159d23d3b73b56f445e6097890970 differ diff --git a/clock/Library/Artifacts/d8/d8946eae7d749cff6ec5bbe62b45c457 b/clock/Library/Artifacts/d8/d8946eae7d749cff6ec5bbe62b45c457 new file mode 100644 index 00000000..d7d9e00e Binary files /dev/null and b/clock/Library/Artifacts/d8/d8946eae7d749cff6ec5bbe62b45c457 differ diff --git a/clock/Library/Artifacts/d8/d8952f28d9f00eba5d90c7f9035f87a9 b/clock/Library/Artifacts/d8/d8952f28d9f00eba5d90c7f9035f87a9 new file mode 100644 index 00000000..a2b81c97 Binary files /dev/null and b/clock/Library/Artifacts/d8/d8952f28d9f00eba5d90c7f9035f87a9 differ diff --git a/clock/Library/Artifacts/d8/d89db13aa7dd39fb0480d5785412594f b/clock/Library/Artifacts/d8/d89db13aa7dd39fb0480d5785412594f new file mode 100644 index 00000000..32640a37 Binary files /dev/null and b/clock/Library/Artifacts/d8/d89db13aa7dd39fb0480d5785412594f differ diff --git a/clock/Library/Artifacts/d8/d8e9f1a66a8959870bfba1f1ca9f8728 b/clock/Library/Artifacts/d8/d8e9f1a66a8959870bfba1f1ca9f8728 new file mode 100644 index 00000000..608706f4 Binary files /dev/null and b/clock/Library/Artifacts/d8/d8e9f1a66a8959870bfba1f1ca9f8728 differ diff --git a/clock/Library/Artifacts/d9/d911d03e2f0bbfdf0d0841d7cd6788a6 b/clock/Library/Artifacts/d9/d911d03e2f0bbfdf0d0841d7cd6788a6 new file mode 100644 index 00000000..b5b6296d Binary files /dev/null and b/clock/Library/Artifacts/d9/d911d03e2f0bbfdf0d0841d7cd6788a6 differ diff --git a/clock/Library/Artifacts/d9/d913d0a7a2ad7a2ac35ebf65753cde95 b/clock/Library/Artifacts/d9/d913d0a7a2ad7a2ac35ebf65753cde95 new file mode 100644 index 00000000..9e5859e1 Binary files /dev/null and b/clock/Library/Artifacts/d9/d913d0a7a2ad7a2ac35ebf65753cde95 differ diff --git a/clock/Library/Artifacts/d9/d9623e61eb37847834ee9d4c8c1f3d99 b/clock/Library/Artifacts/d9/d9623e61eb37847834ee9d4c8c1f3d99 new file mode 100644 index 00000000..422a13e9 Binary files /dev/null and b/clock/Library/Artifacts/d9/d9623e61eb37847834ee9d4c8c1f3d99 differ diff --git a/clock/Library/Artifacts/d9/d9a285b0f2d26b04ca8cecf779f689b3 b/clock/Library/Artifacts/d9/d9a285b0f2d26b04ca8cecf779f689b3 new file mode 100644 index 00000000..0679ef09 Binary files /dev/null and b/clock/Library/Artifacts/d9/d9a285b0f2d26b04ca8cecf779f689b3 differ diff --git a/clock/Library/Artifacts/d9/d9a4da39794f8befc686e0d51dfaa5aa b/clock/Library/Artifacts/d9/d9a4da39794f8befc686e0d51dfaa5aa new file mode 100644 index 00000000..63e48df3 Binary files /dev/null and b/clock/Library/Artifacts/d9/d9a4da39794f8befc686e0d51dfaa5aa differ diff --git a/clock/Library/Artifacts/d9/d9b095f7ef2631f85773b775e867925b b/clock/Library/Artifacts/d9/d9b095f7ef2631f85773b775e867925b new file mode 100644 index 00000000..bd032685 Binary files /dev/null and b/clock/Library/Artifacts/d9/d9b095f7ef2631f85773b775e867925b differ diff --git a/clock/Library/Artifacts/d9/d9c9fc42083200e8d447930fb06ef6e7 b/clock/Library/Artifacts/d9/d9c9fc42083200e8d447930fb06ef6e7 new file mode 100644 index 00000000..0f9102a3 Binary files /dev/null and b/clock/Library/Artifacts/d9/d9c9fc42083200e8d447930fb06ef6e7 differ diff --git a/clock/Library/Artifacts/da/da7171a99e64c67697223aa166ea96ee b/clock/Library/Artifacts/da/da7171a99e64c67697223aa166ea96ee new file mode 100644 index 00000000..53375aa1 Binary files /dev/null and b/clock/Library/Artifacts/da/da7171a99e64c67697223aa166ea96ee differ diff --git a/clock/Library/Artifacts/db/db2ccad39b795f8e221b0b5b69da626b b/clock/Library/Artifacts/db/db2ccad39b795f8e221b0b5b69da626b new file mode 100644 index 00000000..85b4fca8 Binary files /dev/null and b/clock/Library/Artifacts/db/db2ccad39b795f8e221b0b5b69da626b differ diff --git a/clock/Library/Artifacts/db/db47ddc4e51b2af74ffad777368ff5c7 b/clock/Library/Artifacts/db/db47ddc4e51b2af74ffad777368ff5c7 new file mode 100644 index 00000000..9062418f Binary files /dev/null and b/clock/Library/Artifacts/db/db47ddc4e51b2af74ffad777368ff5c7 differ diff --git a/clock/Library/Artifacts/dc/dc094448302ddba08a28eabb1a7e0b91 b/clock/Library/Artifacts/dc/dc094448302ddba08a28eabb1a7e0b91 new file mode 100644 index 00000000..afc197c5 Binary files /dev/null and b/clock/Library/Artifacts/dc/dc094448302ddba08a28eabb1a7e0b91 differ diff --git a/clock/Library/Artifacts/dc/dc1fef27c272d46d89bacfd2ce7d849c b/clock/Library/Artifacts/dc/dc1fef27c272d46d89bacfd2ce7d849c new file mode 100644 index 00000000..3ea86024 Binary files /dev/null and b/clock/Library/Artifacts/dc/dc1fef27c272d46d89bacfd2ce7d849c differ diff --git a/clock/Library/Artifacts/dc/dc430743d03af635c246afdc7081d5d7 b/clock/Library/Artifacts/dc/dc430743d03af635c246afdc7081d5d7 new file mode 100644 index 00000000..1f895e89 Binary files /dev/null and b/clock/Library/Artifacts/dc/dc430743d03af635c246afdc7081d5d7 differ diff --git a/clock/Library/Artifacts/dc/dc608d1dc5bf7aa580f8e122d3fe6c81 b/clock/Library/Artifacts/dc/dc608d1dc5bf7aa580f8e122d3fe6c81 new file mode 100644 index 00000000..910f6793 Binary files /dev/null and b/clock/Library/Artifacts/dc/dc608d1dc5bf7aa580f8e122d3fe6c81 differ diff --git a/clock/Library/Artifacts/dc/dcc5428675c9f154a055bf0fa0d74a87 b/clock/Library/Artifacts/dc/dcc5428675c9f154a055bf0fa0d74a87 new file mode 100644 index 00000000..3d0c99d2 Binary files /dev/null and b/clock/Library/Artifacts/dc/dcc5428675c9f154a055bf0fa0d74a87 differ diff --git a/clock/Library/Artifacts/dd/dd59c653ae4a6e02fb471b96238ec97b b/clock/Library/Artifacts/dd/dd59c653ae4a6e02fb471b96238ec97b new file mode 100644 index 00000000..965c0bd8 Binary files /dev/null and b/clock/Library/Artifacts/dd/dd59c653ae4a6e02fb471b96238ec97b differ diff --git a/clock/Library/Artifacts/dd/dd6132dd6bc2cd3e6d202746b231780e b/clock/Library/Artifacts/dd/dd6132dd6bc2cd3e6d202746b231780e new file mode 100644 index 00000000..a8f189f2 Binary files /dev/null and b/clock/Library/Artifacts/dd/dd6132dd6bc2cd3e6d202746b231780e differ diff --git a/clock/Library/Artifacts/dd/ddca9a66f7068c6c9817a883595e7feb b/clock/Library/Artifacts/dd/ddca9a66f7068c6c9817a883595e7feb new file mode 100644 index 00000000..d0880f45 Binary files /dev/null and b/clock/Library/Artifacts/dd/ddca9a66f7068c6c9817a883595e7feb differ diff --git a/clock/Library/Artifacts/dd/ddd4c5b7b80f1c48751b800ec3cffb16 b/clock/Library/Artifacts/dd/ddd4c5b7b80f1c48751b800ec3cffb16 new file mode 100644 index 00000000..8d654f04 Binary files /dev/null and b/clock/Library/Artifacts/dd/ddd4c5b7b80f1c48751b800ec3cffb16 differ diff --git a/clock/Library/Artifacts/dd/ddf17e443c771a55e39b70cb37cd2002 b/clock/Library/Artifacts/dd/ddf17e443c771a55e39b70cb37cd2002 new file mode 100644 index 00000000..7448f4a0 Binary files /dev/null and b/clock/Library/Artifacts/dd/ddf17e443c771a55e39b70cb37cd2002 differ diff --git a/clock/Library/Artifacts/de/de595d2b354a939afe3aea8e9a90ed26 b/clock/Library/Artifacts/de/de595d2b354a939afe3aea8e9a90ed26 new file mode 100644 index 00000000..801d59c5 Binary files /dev/null and b/clock/Library/Artifacts/de/de595d2b354a939afe3aea8e9a90ed26 differ diff --git a/clock/Library/Artifacts/de/dea4ad1191a6572f8e86ec5b5041f146 b/clock/Library/Artifacts/de/dea4ad1191a6572f8e86ec5b5041f146 new file mode 100644 index 00000000..ec50c249 Binary files /dev/null and b/clock/Library/Artifacts/de/dea4ad1191a6572f8e86ec5b5041f146 differ diff --git a/clock/Library/Artifacts/df/df00dd15da29c94136b9ebd7a14ce30f b/clock/Library/Artifacts/df/df00dd15da29c94136b9ebd7a14ce30f new file mode 100644 index 00000000..a0b85f7c Binary files /dev/null and b/clock/Library/Artifacts/df/df00dd15da29c94136b9ebd7a14ce30f differ diff --git a/clock/Library/Artifacts/df/df08f17aa568026438e5773414e574e0 b/clock/Library/Artifacts/df/df08f17aa568026438e5773414e574e0 new file mode 100644 index 00000000..0321701d Binary files /dev/null and b/clock/Library/Artifacts/df/df08f17aa568026438e5773414e574e0 differ diff --git a/clock/Library/Artifacts/df/df497d53d15903a90aa122624bf56019 b/clock/Library/Artifacts/df/df497d53d15903a90aa122624bf56019 new file mode 100644 index 00000000..2676356c Binary files /dev/null and b/clock/Library/Artifacts/df/df497d53d15903a90aa122624bf56019 differ diff --git a/clock/Library/Artifacts/df/df8b4a9d16b070102c6315ebf715ae7d b/clock/Library/Artifacts/df/df8b4a9d16b070102c6315ebf715ae7d new file mode 100644 index 00000000..5a186bf0 Binary files /dev/null and b/clock/Library/Artifacts/df/df8b4a9d16b070102c6315ebf715ae7d differ diff --git a/clock/Library/Artifacts/df/df9d25f580ea5bea175109d83bb3c3fa b/clock/Library/Artifacts/df/df9d25f580ea5bea175109d83bb3c3fa new file mode 100644 index 00000000..e9949c64 Binary files /dev/null and b/clock/Library/Artifacts/df/df9d25f580ea5bea175109d83bb3c3fa differ diff --git a/clock/Library/Artifacts/df/dfaeb6166620c812eb3187639ab5ce7a b/clock/Library/Artifacts/df/dfaeb6166620c812eb3187639ab5ce7a new file mode 100644 index 00000000..1e84331b Binary files /dev/null and b/clock/Library/Artifacts/df/dfaeb6166620c812eb3187639ab5ce7a differ diff --git a/clock/Library/Artifacts/df/dff19d3e9cf019f71a5b1677cea4d278 b/clock/Library/Artifacts/df/dff19d3e9cf019f71a5b1677cea4d278 new file mode 100644 index 00000000..6ef61be2 Binary files /dev/null and b/clock/Library/Artifacts/df/dff19d3e9cf019f71a5b1677cea4d278 differ diff --git a/clock/Library/Artifacts/e0/e04369d9ab3c0f02d0456c9cedd39d3b b/clock/Library/Artifacts/e0/e04369d9ab3c0f02d0456c9cedd39d3b new file mode 100644 index 00000000..8c787817 Binary files /dev/null and b/clock/Library/Artifacts/e0/e04369d9ab3c0f02d0456c9cedd39d3b differ diff --git a/clock/Library/Artifacts/e0/e07cc26f6f5a18d1e62a73104ce14398 b/clock/Library/Artifacts/e0/e07cc26f6f5a18d1e62a73104ce14398 new file mode 100644 index 00000000..c52b7905 Binary files /dev/null and b/clock/Library/Artifacts/e0/e07cc26f6f5a18d1e62a73104ce14398 differ diff --git a/clock/Library/Artifacts/e0/e08c33ae0fa3f6a05f8013ef265feef4 b/clock/Library/Artifacts/e0/e08c33ae0fa3f6a05f8013ef265feef4 new file mode 100644 index 00000000..7bfc4835 Binary files /dev/null and b/clock/Library/Artifacts/e0/e08c33ae0fa3f6a05f8013ef265feef4 differ diff --git a/clock/Library/Artifacts/e0/e0a6fed8dbd9f79c2e4d63861f0691a7 b/clock/Library/Artifacts/e0/e0a6fed8dbd9f79c2e4d63861f0691a7 new file mode 100644 index 00000000..0b10fe05 Binary files /dev/null and b/clock/Library/Artifacts/e0/e0a6fed8dbd9f79c2e4d63861f0691a7 differ diff --git a/clock/Library/Artifacts/e0/e0bb1da75cb8448531ebd2c4b3796ce0 b/clock/Library/Artifacts/e0/e0bb1da75cb8448531ebd2c4b3796ce0 new file mode 100644 index 00000000..23e9d5b3 Binary files /dev/null and b/clock/Library/Artifacts/e0/e0bb1da75cb8448531ebd2c4b3796ce0 differ diff --git a/clock/Library/Artifacts/e0/e0d1d6d65b5b1d0c94efa5bdd124ebc4 b/clock/Library/Artifacts/e0/e0d1d6d65b5b1d0c94efa5bdd124ebc4 new file mode 100644 index 00000000..92163901 Binary files /dev/null and b/clock/Library/Artifacts/e0/e0d1d6d65b5b1d0c94efa5bdd124ebc4 differ diff --git a/clock/Library/Artifacts/e1/e10919cd9e14fabb90605668ae8e73c0 b/clock/Library/Artifacts/e1/e10919cd9e14fabb90605668ae8e73c0 new file mode 100644 index 00000000..7b60cbae Binary files /dev/null and b/clock/Library/Artifacts/e1/e10919cd9e14fabb90605668ae8e73c0 differ diff --git a/clock/Library/Artifacts/e1/e11199b5599adebe0a61b28615688dd2 b/clock/Library/Artifacts/e1/e11199b5599adebe0a61b28615688dd2 new file mode 100644 index 00000000..fb42c96f Binary files /dev/null and b/clock/Library/Artifacts/e1/e11199b5599adebe0a61b28615688dd2 differ diff --git a/clock/Library/Artifacts/e1/e13f7221972f0758467276ea877eeba1 b/clock/Library/Artifacts/e1/e13f7221972f0758467276ea877eeba1 new file mode 100644 index 00000000..3f5e350b Binary files /dev/null and b/clock/Library/Artifacts/e1/e13f7221972f0758467276ea877eeba1 differ diff --git a/clock/Library/Artifacts/e1/e161f2a13f8b54720f02b3dd20ffa196 b/clock/Library/Artifacts/e1/e161f2a13f8b54720f02b3dd20ffa196 new file mode 100644 index 00000000..36893be5 Binary files /dev/null and b/clock/Library/Artifacts/e1/e161f2a13f8b54720f02b3dd20ffa196 differ diff --git a/clock/Library/Artifacts/e1/e16bb4d98688b3d502a100f105aa402f b/clock/Library/Artifacts/e1/e16bb4d98688b3d502a100f105aa402f new file mode 100644 index 00000000..5b687caf Binary files /dev/null and b/clock/Library/Artifacts/e1/e16bb4d98688b3d502a100f105aa402f differ diff --git a/clock/Library/Artifacts/e1/e178a15127cef729ff6304488b61fd29 b/clock/Library/Artifacts/e1/e178a15127cef729ff6304488b61fd29 new file mode 100644 index 00000000..aa22bbba Binary files /dev/null and b/clock/Library/Artifacts/e1/e178a15127cef729ff6304488b61fd29 differ diff --git a/clock/Library/Artifacts/e1/e17c0dd55ae2676be2964270f53b4557 b/clock/Library/Artifacts/e1/e17c0dd55ae2676be2964270f53b4557 new file mode 100644 index 00000000..22cee39e Binary files /dev/null and b/clock/Library/Artifacts/e1/e17c0dd55ae2676be2964270f53b4557 differ diff --git a/clock/Library/Artifacts/e1/e1a4809b0ca0a9168f8e2bb5664149ff b/clock/Library/Artifacts/e1/e1a4809b0ca0a9168f8e2bb5664149ff new file mode 100644 index 00000000..20543f99 Binary files /dev/null and b/clock/Library/Artifacts/e1/e1a4809b0ca0a9168f8e2bb5664149ff differ diff --git a/clock/Library/Artifacts/e1/e1af80682a879737acc3d7332c1790ed b/clock/Library/Artifacts/e1/e1af80682a879737acc3d7332c1790ed new file mode 100644 index 00000000..671b21b5 Binary files /dev/null and b/clock/Library/Artifacts/e1/e1af80682a879737acc3d7332c1790ed differ diff --git a/clock/Library/Artifacts/e1/e1c266b7486775a295d33805c27fe1bb b/clock/Library/Artifacts/e1/e1c266b7486775a295d33805c27fe1bb new file mode 100644 index 00000000..d7792d33 Binary files /dev/null and b/clock/Library/Artifacts/e1/e1c266b7486775a295d33805c27fe1bb differ diff --git a/clock/Library/Artifacts/e1/e1ec6170dbbfc9dfd4e7b664cee8f702 b/clock/Library/Artifacts/e1/e1ec6170dbbfc9dfd4e7b664cee8f702 new file mode 100644 index 00000000..3c623850 Binary files /dev/null and b/clock/Library/Artifacts/e1/e1ec6170dbbfc9dfd4e7b664cee8f702 differ diff --git a/clock/Library/Artifacts/e1/e1f8648bd28388eb2e1191d3cb1e9223 b/clock/Library/Artifacts/e1/e1f8648bd28388eb2e1191d3cb1e9223 new file mode 100644 index 00000000..718739ab Binary files /dev/null and b/clock/Library/Artifacts/e1/e1f8648bd28388eb2e1191d3cb1e9223 differ diff --git a/clock/Library/Artifacts/e2/e24d77ba62b077e854140e5cbf634fed b/clock/Library/Artifacts/e2/e24d77ba62b077e854140e5cbf634fed new file mode 100644 index 00000000..ec396f9f Binary files /dev/null and b/clock/Library/Artifacts/e2/e24d77ba62b077e854140e5cbf634fed differ diff --git a/clock/Library/Artifacts/e2/e24e0202c24322de8ac4df4ab0c69bcc b/clock/Library/Artifacts/e2/e24e0202c24322de8ac4df4ab0c69bcc new file mode 100644 index 00000000..7bc1c5f7 Binary files /dev/null and b/clock/Library/Artifacts/e2/e24e0202c24322de8ac4df4ab0c69bcc differ diff --git a/clock/Library/Artifacts/e2/e26b3f2a9c9c215886f6d7df5dc6a3f6 b/clock/Library/Artifacts/e2/e26b3f2a9c9c215886f6d7df5dc6a3f6 new file mode 100644 index 00000000..71783c20 Binary files /dev/null and b/clock/Library/Artifacts/e2/e26b3f2a9c9c215886f6d7df5dc6a3f6 differ diff --git a/clock/Library/Artifacts/e2/e2c2286d830ec638dc74228d963946cd b/clock/Library/Artifacts/e2/e2c2286d830ec638dc74228d963946cd new file mode 100644 index 00000000..719568e4 Binary files /dev/null and b/clock/Library/Artifacts/e2/e2c2286d830ec638dc74228d963946cd differ diff --git a/clock/Library/Artifacts/e3/e34d579293e3c44f925d839e89b1e9d2 b/clock/Library/Artifacts/e3/e34d579293e3c44f925d839e89b1e9d2 new file mode 100644 index 00000000..e9ebdbd9 Binary files /dev/null and b/clock/Library/Artifacts/e3/e34d579293e3c44f925d839e89b1e9d2 differ diff --git a/clock/Library/Artifacts/e3/e36ba6aa68853be751151172cc527925 b/clock/Library/Artifacts/e3/e36ba6aa68853be751151172cc527925 new file mode 100644 index 00000000..1b6f325b Binary files /dev/null and b/clock/Library/Artifacts/e3/e36ba6aa68853be751151172cc527925 differ diff --git a/clock/Library/Artifacts/e3/e3724864d5ecc5f2b38679ddc4e1cfd3 b/clock/Library/Artifacts/e3/e3724864d5ecc5f2b38679ddc4e1cfd3 new file mode 100644 index 00000000..b79516d7 Binary files /dev/null and b/clock/Library/Artifacts/e3/e3724864d5ecc5f2b38679ddc4e1cfd3 differ diff --git a/clock/Library/Artifacts/e3/e37cd12b4e4313352ad4af48c0be3b3e b/clock/Library/Artifacts/e3/e37cd12b4e4313352ad4af48c0be3b3e new file mode 100644 index 00000000..6c5392c2 Binary files /dev/null and b/clock/Library/Artifacts/e3/e37cd12b4e4313352ad4af48c0be3b3e differ diff --git a/clock/Library/Artifacts/e3/e381fbac04193392a31e1ca7b49bddd4 b/clock/Library/Artifacts/e3/e381fbac04193392a31e1ca7b49bddd4 new file mode 100644 index 00000000..341077b3 Binary files /dev/null and b/clock/Library/Artifacts/e3/e381fbac04193392a31e1ca7b49bddd4 differ diff --git a/clock/Library/Artifacts/e4/e471e1a9f5ac68b8e9adc34598282bf0 b/clock/Library/Artifacts/e4/e471e1a9f5ac68b8e9adc34598282bf0 new file mode 100644 index 00000000..81d9cd61 Binary files /dev/null and b/clock/Library/Artifacts/e4/e471e1a9f5ac68b8e9adc34598282bf0 differ diff --git a/clock/Library/Artifacts/e4/e4929411192dcf9e2014cf3322280ff3 b/clock/Library/Artifacts/e4/e4929411192dcf9e2014cf3322280ff3 new file mode 100644 index 00000000..7bc7a063 Binary files /dev/null and b/clock/Library/Artifacts/e4/e4929411192dcf9e2014cf3322280ff3 differ diff --git a/clock/Library/Artifacts/e4/e4b9c5b4fd3f0ffd5e96f2c01fcf6515 b/clock/Library/Artifacts/e4/e4b9c5b4fd3f0ffd5e96f2c01fcf6515 new file mode 100644 index 00000000..14264d10 Binary files /dev/null and b/clock/Library/Artifacts/e4/e4b9c5b4fd3f0ffd5e96f2c01fcf6515 differ diff --git a/clock/Library/Artifacts/e4/e4e46b3a01387d2cbd464059b0663efa b/clock/Library/Artifacts/e4/e4e46b3a01387d2cbd464059b0663efa new file mode 100644 index 00000000..f9553bba Binary files /dev/null and b/clock/Library/Artifacts/e4/e4e46b3a01387d2cbd464059b0663efa differ diff --git a/clock/Library/Artifacts/e4/e4f33dff274c386be3932aa15c37e400 b/clock/Library/Artifacts/e4/e4f33dff274c386be3932aa15c37e400 new file mode 100644 index 00000000..452a9229 Binary files /dev/null and b/clock/Library/Artifacts/e4/e4f33dff274c386be3932aa15c37e400 differ diff --git a/clock/Library/Artifacts/e4/e4f709e691bb9a7d8428b837802d8675 b/clock/Library/Artifacts/e4/e4f709e691bb9a7d8428b837802d8675 new file mode 100644 index 00000000..d722d113 Binary files /dev/null and b/clock/Library/Artifacts/e4/e4f709e691bb9a7d8428b837802d8675 differ diff --git a/clock/Library/Artifacts/e5/e54a79e25dffa517d5686c9c90269bf6 b/clock/Library/Artifacts/e5/e54a79e25dffa517d5686c9c90269bf6 new file mode 100644 index 00000000..74cfc8eb Binary files /dev/null and b/clock/Library/Artifacts/e5/e54a79e25dffa517d5686c9c90269bf6 differ diff --git a/clock/Library/Artifacts/e5/e550806d9fb087d7643f934fbfd0a66c b/clock/Library/Artifacts/e5/e550806d9fb087d7643f934fbfd0a66c new file mode 100644 index 00000000..17b2eba6 Binary files /dev/null and b/clock/Library/Artifacts/e5/e550806d9fb087d7643f934fbfd0a66c differ diff --git a/clock/Library/Artifacts/e5/e593bd9e13c0631de1ecc263751a3863 b/clock/Library/Artifacts/e5/e593bd9e13c0631de1ecc263751a3863 new file mode 100644 index 00000000..3b6e3a71 Binary files /dev/null and b/clock/Library/Artifacts/e5/e593bd9e13c0631de1ecc263751a3863 differ diff --git a/clock/Library/Artifacts/e5/e5a7a7a17cdf0bf3585faf803b799eee b/clock/Library/Artifacts/e5/e5a7a7a17cdf0bf3585faf803b799eee new file mode 100644 index 00000000..8674cdc0 Binary files /dev/null and b/clock/Library/Artifacts/e5/e5a7a7a17cdf0bf3585faf803b799eee differ diff --git a/clock/Library/Artifacts/e5/e5a8ace70eee58c9a3f6d47cd8d2d4af b/clock/Library/Artifacts/e5/e5a8ace70eee58c9a3f6d47cd8d2d4af new file mode 100644 index 00000000..11e499cb Binary files /dev/null and b/clock/Library/Artifacts/e5/e5a8ace70eee58c9a3f6d47cd8d2d4af differ diff --git a/clock/Library/Artifacts/e5/e5b85685f6df69a0213197c54922d56d b/clock/Library/Artifacts/e5/e5b85685f6df69a0213197c54922d56d new file mode 100644 index 00000000..cb16dc6b Binary files /dev/null and b/clock/Library/Artifacts/e5/e5b85685f6df69a0213197c54922d56d differ diff --git a/clock/Library/Artifacts/e6/e60f9a721b10f9187f7e38e281f4f29e b/clock/Library/Artifacts/e6/e60f9a721b10f9187f7e38e281f4f29e new file mode 100644 index 00000000..f714c4a6 Binary files /dev/null and b/clock/Library/Artifacts/e6/e60f9a721b10f9187f7e38e281f4f29e differ diff --git a/clock/Library/Artifacts/e6/e68d9495434e7a8ac3562326f899b93c b/clock/Library/Artifacts/e6/e68d9495434e7a8ac3562326f899b93c new file mode 100644 index 00000000..df1f86d7 Binary files /dev/null and b/clock/Library/Artifacts/e6/e68d9495434e7a8ac3562326f899b93c differ diff --git a/clock/Library/Artifacts/e6/e68db983d463738f860f86e6f96893f9 b/clock/Library/Artifacts/e6/e68db983d463738f860f86e6f96893f9 new file mode 100644 index 00000000..a476bede Binary files /dev/null and b/clock/Library/Artifacts/e6/e68db983d463738f860f86e6f96893f9 differ diff --git a/clock/Library/Artifacts/e6/e6a2e1ab3d32fb7a09dd376d8bafdda7 b/clock/Library/Artifacts/e6/e6a2e1ab3d32fb7a09dd376d8bafdda7 new file mode 100644 index 00000000..bd5a9625 Binary files /dev/null and b/clock/Library/Artifacts/e6/e6a2e1ab3d32fb7a09dd376d8bafdda7 differ diff --git a/clock/Library/Artifacts/e6/e6a85dc70b546ca3681d788b2cd9fa96 b/clock/Library/Artifacts/e6/e6a85dc70b546ca3681d788b2cd9fa96 new file mode 100644 index 00000000..ae0a56fb Binary files /dev/null and b/clock/Library/Artifacts/e6/e6a85dc70b546ca3681d788b2cd9fa96 differ diff --git a/clock/Library/Artifacts/e6/e6f59a3c8f620aa836ee8f448fb9a328 b/clock/Library/Artifacts/e6/e6f59a3c8f620aa836ee8f448fb9a328 new file mode 100644 index 00000000..271f0985 Binary files /dev/null and b/clock/Library/Artifacts/e6/e6f59a3c8f620aa836ee8f448fb9a328 differ diff --git a/clock/Library/Artifacts/e7/e72ad4a58318403e0031388eea7ff45a b/clock/Library/Artifacts/e7/e72ad4a58318403e0031388eea7ff45a new file mode 100644 index 00000000..3ac9d010 Binary files /dev/null and b/clock/Library/Artifacts/e7/e72ad4a58318403e0031388eea7ff45a differ diff --git a/clock/Library/Artifacts/e7/e73be2f74e52eb6f620659cf5c7e5a5c b/clock/Library/Artifacts/e7/e73be2f74e52eb6f620659cf5c7e5a5c new file mode 100644 index 00000000..090ac1f6 Binary files /dev/null and b/clock/Library/Artifacts/e7/e73be2f74e52eb6f620659cf5c7e5a5c differ diff --git a/clock/Library/Artifacts/e7/e77bc2d92b714ccb89c26bae17c49722 b/clock/Library/Artifacts/e7/e77bc2d92b714ccb89c26bae17c49722 new file mode 100644 index 00000000..ab5d6f8c Binary files /dev/null and b/clock/Library/Artifacts/e7/e77bc2d92b714ccb89c26bae17c49722 differ diff --git a/clock/Library/Artifacts/e7/e77de76b35c5e88f8e4fa25f451f7f5c b/clock/Library/Artifacts/e7/e77de76b35c5e88f8e4fa25f451f7f5c new file mode 100644 index 00000000..7197ef76 Binary files /dev/null and b/clock/Library/Artifacts/e7/e77de76b35c5e88f8e4fa25f451f7f5c differ diff --git a/clock/Library/Artifacts/e7/e7c5095dc9418eed3e9b68d246d59e46 b/clock/Library/Artifacts/e7/e7c5095dc9418eed3e9b68d246d59e46 new file mode 100644 index 00000000..b427f12a Binary files /dev/null and b/clock/Library/Artifacts/e7/e7c5095dc9418eed3e9b68d246d59e46 differ diff --git a/clock/Library/Artifacts/e8/e80d3bb500f4e196898156df85fe2f8e b/clock/Library/Artifacts/e8/e80d3bb500f4e196898156df85fe2f8e new file mode 100644 index 00000000..e3c67500 Binary files /dev/null and b/clock/Library/Artifacts/e8/e80d3bb500f4e196898156df85fe2f8e differ diff --git a/clock/Library/Artifacts/e8/e8194503f58f07da5a97290070b0df24 b/clock/Library/Artifacts/e8/e8194503f58f07da5a97290070b0df24 new file mode 100644 index 00000000..aabd9dff Binary files /dev/null and b/clock/Library/Artifacts/e8/e8194503f58f07da5a97290070b0df24 differ diff --git a/clock/Library/Artifacts/e8/e839f0f1cd06e75e19e305d9ca08e8b5 b/clock/Library/Artifacts/e8/e839f0f1cd06e75e19e305d9ca08e8b5 new file mode 100644 index 00000000..03effe2c Binary files /dev/null and b/clock/Library/Artifacts/e8/e839f0f1cd06e75e19e305d9ca08e8b5 differ diff --git a/clock/Library/Artifacts/e8/e84f367ba071a639e568e845eac23bd9 b/clock/Library/Artifacts/e8/e84f367ba071a639e568e845eac23bd9 new file mode 100644 index 00000000..fd544cc1 Binary files /dev/null and b/clock/Library/Artifacts/e8/e84f367ba071a639e568e845eac23bd9 differ diff --git a/clock/Library/Artifacts/e8/e8718c0fe6cef389fc729386da0568aa b/clock/Library/Artifacts/e8/e8718c0fe6cef389fc729386da0568aa new file mode 100644 index 00000000..75f80174 Binary files /dev/null and b/clock/Library/Artifacts/e8/e8718c0fe6cef389fc729386da0568aa differ diff --git a/clock/Library/Artifacts/e8/e8af794662ec93239a304a9cb42df650 b/clock/Library/Artifacts/e8/e8af794662ec93239a304a9cb42df650 new file mode 100644 index 00000000..cb092014 Binary files /dev/null and b/clock/Library/Artifacts/e8/e8af794662ec93239a304a9cb42df650 differ diff --git a/clock/Library/Artifacts/e9/e91559de5a0c8c854c874348134fae4a b/clock/Library/Artifacts/e9/e91559de5a0c8c854c874348134fae4a new file mode 100644 index 00000000..05855dc3 Binary files /dev/null and b/clock/Library/Artifacts/e9/e91559de5a0c8c854c874348134fae4a differ diff --git a/clock/Library/Artifacts/e9/e92e622c8b7d96dc68f5ba636ebce2b2 b/clock/Library/Artifacts/e9/e92e622c8b7d96dc68f5ba636ebce2b2 new file mode 100644 index 00000000..30593167 Binary files /dev/null and b/clock/Library/Artifacts/e9/e92e622c8b7d96dc68f5ba636ebce2b2 differ diff --git a/clock/Library/Artifacts/e9/e939072d0a0295f8768cf3eb2204c8ec b/clock/Library/Artifacts/e9/e939072d0a0295f8768cf3eb2204c8ec new file mode 100644 index 00000000..1acb02d7 Binary files /dev/null and b/clock/Library/Artifacts/e9/e939072d0a0295f8768cf3eb2204c8ec differ diff --git a/clock/Library/Artifacts/e9/e96ab8868e03bd26ab29c8ab78ad2221 b/clock/Library/Artifacts/e9/e96ab8868e03bd26ab29c8ab78ad2221 new file mode 100644 index 00000000..cf2132eb Binary files /dev/null and b/clock/Library/Artifacts/e9/e96ab8868e03bd26ab29c8ab78ad2221 differ diff --git a/clock/Library/Artifacts/e9/e973f5d6e7cab487cae08cbf50413c47 b/clock/Library/Artifacts/e9/e973f5d6e7cab487cae08cbf50413c47 new file mode 100644 index 00000000..a05d9e4e Binary files /dev/null and b/clock/Library/Artifacts/e9/e973f5d6e7cab487cae08cbf50413c47 differ diff --git a/clock/Library/Artifacts/e9/e9d3f9b76c57db6e0e0aa2e2e09c07ef b/clock/Library/Artifacts/e9/e9d3f9b76c57db6e0e0aa2e2e09c07ef new file mode 100644 index 00000000..c5d8cfb0 Binary files /dev/null and b/clock/Library/Artifacts/e9/e9d3f9b76c57db6e0e0aa2e2e09c07ef differ diff --git a/clock/Library/Artifacts/e9/e9ef91ffa5f8f0a443c8685253340eb4 b/clock/Library/Artifacts/e9/e9ef91ffa5f8f0a443c8685253340eb4 new file mode 100644 index 00000000..af4818df Binary files /dev/null and b/clock/Library/Artifacts/e9/e9ef91ffa5f8f0a443c8685253340eb4 differ diff --git a/clock/Library/Artifacts/ea/ea191d482bd4e41347c69feca8c438cf b/clock/Library/Artifacts/ea/ea191d482bd4e41347c69feca8c438cf new file mode 100644 index 00000000..838690fb Binary files /dev/null and b/clock/Library/Artifacts/ea/ea191d482bd4e41347c69feca8c438cf differ diff --git a/clock/Library/Artifacts/ea/eaa644ea47c587f1c7e7df4c497c2a62 b/clock/Library/Artifacts/ea/eaa644ea47c587f1c7e7df4c497c2a62 new file mode 100644 index 00000000..26f3feb3 Binary files /dev/null and b/clock/Library/Artifacts/ea/eaa644ea47c587f1c7e7df4c497c2a62 differ diff --git a/clock/Library/Artifacts/ea/eac9ddf715fb1f6ec2d4b869892dea3f b/clock/Library/Artifacts/ea/eac9ddf715fb1f6ec2d4b869892dea3f new file mode 100644 index 00000000..04f73543 Binary files /dev/null and b/clock/Library/Artifacts/ea/eac9ddf715fb1f6ec2d4b869892dea3f differ diff --git a/clock/Library/Artifacts/eb/eb011ce897c728cd3b3035429cc332ec b/clock/Library/Artifacts/eb/eb011ce897c728cd3b3035429cc332ec new file mode 100644 index 00000000..dbc826e2 Binary files /dev/null and b/clock/Library/Artifacts/eb/eb011ce897c728cd3b3035429cc332ec differ diff --git a/clock/Library/Artifacts/eb/eb2ef1ef7ccecc64b09ce4b0f4e94ed5 b/clock/Library/Artifacts/eb/eb2ef1ef7ccecc64b09ce4b0f4e94ed5 new file mode 100644 index 00000000..a93caf9e Binary files /dev/null and b/clock/Library/Artifacts/eb/eb2ef1ef7ccecc64b09ce4b0f4e94ed5 differ diff --git a/clock/Library/Artifacts/eb/eb9773442d1d552c583b364205f110ab b/clock/Library/Artifacts/eb/eb9773442d1d552c583b364205f110ab new file mode 100644 index 00000000..9e71ab9d Binary files /dev/null and b/clock/Library/Artifacts/eb/eb9773442d1d552c583b364205f110ab differ diff --git a/clock/Library/Artifacts/eb/ebaf94fddec679bc67b6ab95030d443a b/clock/Library/Artifacts/eb/ebaf94fddec679bc67b6ab95030d443a new file mode 100644 index 00000000..9d49fbbb Binary files /dev/null and b/clock/Library/Artifacts/eb/ebaf94fddec679bc67b6ab95030d443a differ diff --git a/clock/Library/Artifacts/eb/ebec9aaa74dd3938bac45929ad603f02 b/clock/Library/Artifacts/eb/ebec9aaa74dd3938bac45929ad603f02 new file mode 100644 index 00000000..2e35b873 Binary files /dev/null and b/clock/Library/Artifacts/eb/ebec9aaa74dd3938bac45929ad603f02 differ diff --git a/clock/Library/Artifacts/ec/ec1b03dfd778a5020578d48ef6fe72b5 b/clock/Library/Artifacts/ec/ec1b03dfd778a5020578d48ef6fe72b5 new file mode 100644 index 00000000..5a9bfda7 Binary files /dev/null and b/clock/Library/Artifacts/ec/ec1b03dfd778a5020578d48ef6fe72b5 differ diff --git a/clock/Library/Artifacts/ec/ec324142b98f1b50a85515e23eea79b5 b/clock/Library/Artifacts/ec/ec324142b98f1b50a85515e23eea79b5 new file mode 100644 index 00000000..c95b1759 Binary files /dev/null and b/clock/Library/Artifacts/ec/ec324142b98f1b50a85515e23eea79b5 differ diff --git a/clock/Library/Artifacts/ec/ec4cc7f33a4da2185a2a7ce48d90527b b/clock/Library/Artifacts/ec/ec4cc7f33a4da2185a2a7ce48d90527b new file mode 100644 index 00000000..b7fc704a Binary files /dev/null and b/clock/Library/Artifacts/ec/ec4cc7f33a4da2185a2a7ce48d90527b differ diff --git a/clock/Library/Artifacts/ed/ed35936990124603dfa13d7c95f2d9c6 b/clock/Library/Artifacts/ed/ed35936990124603dfa13d7c95f2d9c6 new file mode 100644 index 00000000..7c5c5762 Binary files /dev/null and b/clock/Library/Artifacts/ed/ed35936990124603dfa13d7c95f2d9c6 differ diff --git a/clock/Library/Artifacts/ed/ed45a2e1a93aff0eac16a7d70ed38c3f b/clock/Library/Artifacts/ed/ed45a2e1a93aff0eac16a7d70ed38c3f new file mode 100644 index 00000000..34ccccff Binary files /dev/null and b/clock/Library/Artifacts/ed/ed45a2e1a93aff0eac16a7d70ed38c3f differ diff --git a/clock/Library/Artifacts/ed/ed60dd80cf974e1dc019ea96f0b4cec1 b/clock/Library/Artifacts/ed/ed60dd80cf974e1dc019ea96f0b4cec1 new file mode 100644 index 00000000..7c86e602 Binary files /dev/null and b/clock/Library/Artifacts/ed/ed60dd80cf974e1dc019ea96f0b4cec1 differ diff --git a/clock/Library/Artifacts/ed/ed8da21859f45d8433af7fcfde6c1e3b b/clock/Library/Artifacts/ed/ed8da21859f45d8433af7fcfde6c1e3b new file mode 100644 index 00000000..67a374ec Binary files /dev/null and b/clock/Library/Artifacts/ed/ed8da21859f45d8433af7fcfde6c1e3b differ diff --git a/clock/Library/Artifacts/ed/ed95068bab1b6a8453e666159f8a5935 b/clock/Library/Artifacts/ed/ed95068bab1b6a8453e666159f8a5935 new file mode 100644 index 00000000..fc1c510d Binary files /dev/null and b/clock/Library/Artifacts/ed/ed95068bab1b6a8453e666159f8a5935 differ diff --git a/clock/Library/Artifacts/ed/edb8f135a1b1e6209c72af4d3c19d897 b/clock/Library/Artifacts/ed/edb8f135a1b1e6209c72af4d3c19d897 new file mode 100644 index 00000000..ca5177bd Binary files /dev/null and b/clock/Library/Artifacts/ed/edb8f135a1b1e6209c72af4d3c19d897 differ diff --git a/clock/Library/Artifacts/ed/edc5bb0e8cb1b690698b3210f2928184 b/clock/Library/Artifacts/ed/edc5bb0e8cb1b690698b3210f2928184 new file mode 100644 index 00000000..195b25e4 Binary files /dev/null and b/clock/Library/Artifacts/ed/edc5bb0e8cb1b690698b3210f2928184 differ diff --git a/clock/Library/Artifacts/ed/edc7f81088b9a1d66581ade1c1d6c814 b/clock/Library/Artifacts/ed/edc7f81088b9a1d66581ade1c1d6c814 new file mode 100644 index 00000000..f83e3a06 Binary files /dev/null and b/clock/Library/Artifacts/ed/edc7f81088b9a1d66581ade1c1d6c814 differ diff --git a/clock/Library/Artifacts/ed/edccc12187fe339bfc3323b1b7c26ab1 b/clock/Library/Artifacts/ed/edccc12187fe339bfc3323b1b7c26ab1 new file mode 100644 index 00000000..3387c6b6 Binary files /dev/null and b/clock/Library/Artifacts/ed/edccc12187fe339bfc3323b1b7c26ab1 differ diff --git a/clock/Library/Artifacts/ed/ede51d432ed06f325baf45eef2e2ad2d b/clock/Library/Artifacts/ed/ede51d432ed06f325baf45eef2e2ad2d new file mode 100644 index 00000000..48a283ce Binary files /dev/null and b/clock/Library/Artifacts/ed/ede51d432ed06f325baf45eef2e2ad2d differ diff --git a/clock/Library/Artifacts/ed/edf15aaaac7e1751ccf2ebc89eb1ba18 b/clock/Library/Artifacts/ed/edf15aaaac7e1751ccf2ebc89eb1ba18 new file mode 100644 index 00000000..5840ceca Binary files /dev/null and b/clock/Library/Artifacts/ed/edf15aaaac7e1751ccf2ebc89eb1ba18 differ diff --git a/clock/Library/Artifacts/ed/edf92ac2d1475d8fb5c66013b423955e b/clock/Library/Artifacts/ed/edf92ac2d1475d8fb5c66013b423955e new file mode 100644 index 00000000..956713f9 Binary files /dev/null and b/clock/Library/Artifacts/ed/edf92ac2d1475d8fb5c66013b423955e differ diff --git a/clock/Library/Artifacts/ee/ee07c40573e5f361351a0bd0c59d48ed b/clock/Library/Artifacts/ee/ee07c40573e5f361351a0bd0c59d48ed new file mode 100644 index 00000000..5f13c8a8 Binary files /dev/null and b/clock/Library/Artifacts/ee/ee07c40573e5f361351a0bd0c59d48ed differ diff --git a/clock/Library/Artifacts/ee/ee5f3e9912d8db3d893122f790514020 b/clock/Library/Artifacts/ee/ee5f3e9912d8db3d893122f790514020 new file mode 100644 index 00000000..fd9d3445 Binary files /dev/null and b/clock/Library/Artifacts/ee/ee5f3e9912d8db3d893122f790514020 differ diff --git a/clock/Library/Artifacts/ee/ee67636ee13501776afac46e812b74cb b/clock/Library/Artifacts/ee/ee67636ee13501776afac46e812b74cb new file mode 100644 index 00000000..f59a62f3 Binary files /dev/null and b/clock/Library/Artifacts/ee/ee67636ee13501776afac46e812b74cb differ diff --git a/clock/Library/Artifacts/ee/ee6fd3834af039b781300a0a8df1c494 b/clock/Library/Artifacts/ee/ee6fd3834af039b781300a0a8df1c494 new file mode 100644 index 00000000..3b01cbaf Binary files /dev/null and b/clock/Library/Artifacts/ee/ee6fd3834af039b781300a0a8df1c494 differ diff --git a/clock/Library/Artifacts/ee/ee72badd4bc1bafba85bca1c75f3f025 b/clock/Library/Artifacts/ee/ee72badd4bc1bafba85bca1c75f3f025 new file mode 100644 index 00000000..3edf0151 Binary files /dev/null and b/clock/Library/Artifacts/ee/ee72badd4bc1bafba85bca1c75f3f025 differ diff --git a/clock/Library/Artifacts/ee/ee90a95d6e735c60dc6cee95bf393459 b/clock/Library/Artifacts/ee/ee90a95d6e735c60dc6cee95bf393459 new file mode 100644 index 00000000..7007d356 Binary files /dev/null and b/clock/Library/Artifacts/ee/ee90a95d6e735c60dc6cee95bf393459 differ diff --git a/clock/Library/Artifacts/ee/eec987149860d20174a89f6940e0218a b/clock/Library/Artifacts/ee/eec987149860d20174a89f6940e0218a new file mode 100644 index 00000000..b6a65c1f Binary files /dev/null and b/clock/Library/Artifacts/ee/eec987149860d20174a89f6940e0218a differ diff --git a/clock/Library/Artifacts/ee/eee2a8c37ef996bb5b7c8a69ce3819e2 b/clock/Library/Artifacts/ee/eee2a8c37ef996bb5b7c8a69ce3819e2 new file mode 100644 index 00000000..dc979051 Binary files /dev/null and b/clock/Library/Artifacts/ee/eee2a8c37ef996bb5b7c8a69ce3819e2 differ diff --git a/clock/Library/Artifacts/ef/ef0813c4ecf503756ed74641aeee91b0 b/clock/Library/Artifacts/ef/ef0813c4ecf503756ed74641aeee91b0 new file mode 100644 index 00000000..1dc652d0 Binary files /dev/null and b/clock/Library/Artifacts/ef/ef0813c4ecf503756ed74641aeee91b0 differ diff --git a/clock/Library/Artifacts/ef/ef6476486756ce2a3f3f161cb81c6fc1 b/clock/Library/Artifacts/ef/ef6476486756ce2a3f3f161cb81c6fc1 new file mode 100644 index 00000000..d00b0f7a Binary files /dev/null and b/clock/Library/Artifacts/ef/ef6476486756ce2a3f3f161cb81c6fc1 differ diff --git a/clock/Library/Artifacts/ef/ef817c02259d25f6fb62b0b62f902635 b/clock/Library/Artifacts/ef/ef817c02259d25f6fb62b0b62f902635 new file mode 100644 index 00000000..177b443e Binary files /dev/null and b/clock/Library/Artifacts/ef/ef817c02259d25f6fb62b0b62f902635 differ diff --git a/clock/Library/Artifacts/f0/f003bb0b2f2ed0119d1734c76ddb95c5 b/clock/Library/Artifacts/f0/f003bb0b2f2ed0119d1734c76ddb95c5 new file mode 100644 index 00000000..fd1e5777 Binary files /dev/null and b/clock/Library/Artifacts/f0/f003bb0b2f2ed0119d1734c76ddb95c5 differ diff --git a/clock/Library/Artifacts/f0/f022fbc42f9dd5653a6c6ff19c483b82 b/clock/Library/Artifacts/f0/f022fbc42f9dd5653a6c6ff19c483b82 new file mode 100644 index 00000000..e9f77a94 Binary files /dev/null and b/clock/Library/Artifacts/f0/f022fbc42f9dd5653a6c6ff19c483b82 differ diff --git a/clock/Library/Artifacts/f0/f0388a938d07040cb4e4b1c932980318 b/clock/Library/Artifacts/f0/f0388a938d07040cb4e4b1c932980318 new file mode 100644 index 00000000..f069c6cf Binary files /dev/null and b/clock/Library/Artifacts/f0/f0388a938d07040cb4e4b1c932980318 differ diff --git a/clock/Library/Artifacts/f0/f0388ce27d963c7fabdf4b1d6f12f3e5 b/clock/Library/Artifacts/f0/f0388ce27d963c7fabdf4b1d6f12f3e5 new file mode 100644 index 00000000..62300501 Binary files /dev/null and b/clock/Library/Artifacts/f0/f0388ce27d963c7fabdf4b1d6f12f3e5 differ diff --git a/clock/Library/Artifacts/f0/f0a89843ebe75712ee2d63a49558eea1 b/clock/Library/Artifacts/f0/f0a89843ebe75712ee2d63a49558eea1 new file mode 100644 index 00000000..6a18e612 Binary files /dev/null and b/clock/Library/Artifacts/f0/f0a89843ebe75712ee2d63a49558eea1 differ diff --git a/clock/Library/Artifacts/f0/f0ee502363cfd96b48356104ba9f6576 b/clock/Library/Artifacts/f0/f0ee502363cfd96b48356104ba9f6576 new file mode 100644 index 00000000..b3e94a50 Binary files /dev/null and b/clock/Library/Artifacts/f0/f0ee502363cfd96b48356104ba9f6576 differ diff --git a/clock/Library/Artifacts/f1/f1661cca63eb403b447dbb15acd3843c b/clock/Library/Artifacts/f1/f1661cca63eb403b447dbb15acd3843c new file mode 100644 index 00000000..992cbba3 Binary files /dev/null and b/clock/Library/Artifacts/f1/f1661cca63eb403b447dbb15acd3843c differ diff --git a/clock/Library/Artifacts/f1/f1816ffbb0efe0169aca603d8c52867a b/clock/Library/Artifacts/f1/f1816ffbb0efe0169aca603d8c52867a new file mode 100644 index 00000000..36e8c489 Binary files /dev/null and b/clock/Library/Artifacts/f1/f1816ffbb0efe0169aca603d8c52867a differ diff --git a/clock/Library/Artifacts/f1/f1ac08e48411f7b06fe4af16fb4d9db5 b/clock/Library/Artifacts/f1/f1ac08e48411f7b06fe4af16fb4d9db5 new file mode 100644 index 00000000..bd13f390 Binary files /dev/null and b/clock/Library/Artifacts/f1/f1ac08e48411f7b06fe4af16fb4d9db5 differ diff --git a/clock/Library/Artifacts/f1/f1ee7753a77046d2414c001fae46c6d5 b/clock/Library/Artifacts/f1/f1ee7753a77046d2414c001fae46c6d5 new file mode 100644 index 00000000..f43763af Binary files /dev/null and b/clock/Library/Artifacts/f1/f1ee7753a77046d2414c001fae46c6d5 differ diff --git a/clock/Library/Artifacts/f2/f21f4c08dab378b85fb098c28669de38 b/clock/Library/Artifacts/f2/f21f4c08dab378b85fb098c28669de38 new file mode 100644 index 00000000..0fe61a4e Binary files /dev/null and b/clock/Library/Artifacts/f2/f21f4c08dab378b85fb098c28669de38 differ diff --git a/clock/Library/Artifacts/f2/f241515750f344983e0735845923687c b/clock/Library/Artifacts/f2/f241515750f344983e0735845923687c new file mode 100644 index 00000000..6d41bcf7 Binary files /dev/null and b/clock/Library/Artifacts/f2/f241515750f344983e0735845923687c differ diff --git a/clock/Library/Artifacts/f2/f26351a1bb1c6c945b13add7f66380eb b/clock/Library/Artifacts/f2/f26351a1bb1c6c945b13add7f66380eb new file mode 100644 index 00000000..8a2a18c3 Binary files /dev/null and b/clock/Library/Artifacts/f2/f26351a1bb1c6c945b13add7f66380eb differ diff --git a/clock/Library/Artifacts/f2/f2e6c6aaf3402e015c4694aaa855a96d b/clock/Library/Artifacts/f2/f2e6c6aaf3402e015c4694aaa855a96d new file mode 100644 index 00000000..b5708fc4 Binary files /dev/null and b/clock/Library/Artifacts/f2/f2e6c6aaf3402e015c4694aaa855a96d differ diff --git a/clock/Library/Artifacts/f2/f2f31663ee0e896f11aa22008652c101 b/clock/Library/Artifacts/f2/f2f31663ee0e896f11aa22008652c101 new file mode 100644 index 00000000..916ed135 Binary files /dev/null and b/clock/Library/Artifacts/f2/f2f31663ee0e896f11aa22008652c101 differ diff --git a/clock/Library/Artifacts/f3/f306b5ee8506923b1bf045648f1258b9 b/clock/Library/Artifacts/f3/f306b5ee8506923b1bf045648f1258b9 new file mode 100644 index 00000000..5685647a Binary files /dev/null and b/clock/Library/Artifacts/f3/f306b5ee8506923b1bf045648f1258b9 differ diff --git a/clock/Library/Artifacts/f3/f3264405a3f155edae1f8ad194a64078 b/clock/Library/Artifacts/f3/f3264405a3f155edae1f8ad194a64078 new file mode 100644 index 00000000..60e69177 Binary files /dev/null and b/clock/Library/Artifacts/f3/f3264405a3f155edae1f8ad194a64078 differ diff --git a/clock/Library/Artifacts/f3/f351f8a4fc444dc00af8153cd1f038f9 b/clock/Library/Artifacts/f3/f351f8a4fc444dc00af8153cd1f038f9 new file mode 100644 index 00000000..f0df9735 Binary files /dev/null and b/clock/Library/Artifacts/f3/f351f8a4fc444dc00af8153cd1f038f9 differ diff --git a/clock/Library/Artifacts/f4/f42b8411c93f21ec7e00282af8afd634 b/clock/Library/Artifacts/f4/f42b8411c93f21ec7e00282af8afd634 new file mode 100644 index 00000000..b2fbe0c6 Binary files /dev/null and b/clock/Library/Artifacts/f4/f42b8411c93f21ec7e00282af8afd634 differ diff --git a/clock/Library/Artifacts/f4/f4c842d9dff66229677756f131abd3cf b/clock/Library/Artifacts/f4/f4c842d9dff66229677756f131abd3cf new file mode 100644 index 00000000..9f200f77 Binary files /dev/null and b/clock/Library/Artifacts/f4/f4c842d9dff66229677756f131abd3cf differ diff --git a/clock/Library/Artifacts/f5/f508e00ff763d0d5351a9e50b88bf327 b/clock/Library/Artifacts/f5/f508e00ff763d0d5351a9e50b88bf327 new file mode 100644 index 00000000..3e5af6e9 Binary files /dev/null and b/clock/Library/Artifacts/f5/f508e00ff763d0d5351a9e50b88bf327 differ diff --git a/clock/Library/Artifacts/f5/f50a0dbaf1254082efb97bcd967367ca b/clock/Library/Artifacts/f5/f50a0dbaf1254082efb97bcd967367ca new file mode 100644 index 00000000..a06f680c Binary files /dev/null and b/clock/Library/Artifacts/f5/f50a0dbaf1254082efb97bcd967367ca differ diff --git a/clock/Library/Artifacts/f5/f50fac9cb45ef3167d74c0431c95a513 b/clock/Library/Artifacts/f5/f50fac9cb45ef3167d74c0431c95a513 new file mode 100644 index 00000000..e272015b Binary files /dev/null and b/clock/Library/Artifacts/f5/f50fac9cb45ef3167d74c0431c95a513 differ diff --git a/clock/Library/Artifacts/f5/f54ee28f332a3f36e9ee788570d114be b/clock/Library/Artifacts/f5/f54ee28f332a3f36e9ee788570d114be new file mode 100644 index 00000000..8cbdfa94 Binary files /dev/null and b/clock/Library/Artifacts/f5/f54ee28f332a3f36e9ee788570d114be differ diff --git a/clock/Library/Artifacts/f5/f55f5bc9daa73c142822b6b85dd43c64 b/clock/Library/Artifacts/f5/f55f5bc9daa73c142822b6b85dd43c64 new file mode 100644 index 00000000..c926d7fa Binary files /dev/null and b/clock/Library/Artifacts/f5/f55f5bc9daa73c142822b6b85dd43c64 differ diff --git a/clock/Library/Artifacts/f5/f56ae0ad08cbec26c54bf0735ac4185c b/clock/Library/Artifacts/f5/f56ae0ad08cbec26c54bf0735ac4185c new file mode 100644 index 00000000..2a821635 Binary files /dev/null and b/clock/Library/Artifacts/f5/f56ae0ad08cbec26c54bf0735ac4185c differ diff --git a/clock/Library/Artifacts/f5/f57c8e76981f6f46d9bbc48ee7f56814 b/clock/Library/Artifacts/f5/f57c8e76981f6f46d9bbc48ee7f56814 new file mode 100644 index 00000000..b49e708d Binary files /dev/null and b/clock/Library/Artifacts/f5/f57c8e76981f6f46d9bbc48ee7f56814 differ diff --git a/clock/Library/Artifacts/f5/f5ab41285e9e8521984adb8fdbb23540 b/clock/Library/Artifacts/f5/f5ab41285e9e8521984adb8fdbb23540 new file mode 100644 index 00000000..1e4c89a2 Binary files /dev/null and b/clock/Library/Artifacts/f5/f5ab41285e9e8521984adb8fdbb23540 differ diff --git a/clock/Library/Artifacts/f5/f5c4fa80c70126fba5f8dc08d9cddcfe b/clock/Library/Artifacts/f5/f5c4fa80c70126fba5f8dc08d9cddcfe new file mode 100644 index 00000000..3b1c9efb Binary files /dev/null and b/clock/Library/Artifacts/f5/f5c4fa80c70126fba5f8dc08d9cddcfe differ diff --git a/clock/Library/Artifacts/f5/f5c79db07e06ac1e7b3e3127302add04 b/clock/Library/Artifacts/f5/f5c79db07e06ac1e7b3e3127302add04 new file mode 100644 index 00000000..69ed0ec4 Binary files /dev/null and b/clock/Library/Artifacts/f5/f5c79db07e06ac1e7b3e3127302add04 differ diff --git a/clock/Library/Artifacts/f6/f616616cfe31f253146f3c392eb8d4fc b/clock/Library/Artifacts/f6/f616616cfe31f253146f3c392eb8d4fc new file mode 100644 index 00000000..fe4897f5 Binary files /dev/null and b/clock/Library/Artifacts/f6/f616616cfe31f253146f3c392eb8d4fc differ diff --git a/clock/Library/Artifacts/f6/f617cdc62beb04713d9cd8f8eda5c3d2 b/clock/Library/Artifacts/f6/f617cdc62beb04713d9cd8f8eda5c3d2 new file mode 100644 index 00000000..3e7df8fd Binary files /dev/null and b/clock/Library/Artifacts/f6/f617cdc62beb04713d9cd8f8eda5c3d2 differ diff --git a/clock/Library/Artifacts/f6/f6a0a79bb4a48ab28e6c3572d4511bb2 b/clock/Library/Artifacts/f6/f6a0a79bb4a48ab28e6c3572d4511bb2 new file mode 100644 index 00000000..4df5c4e9 Binary files /dev/null and b/clock/Library/Artifacts/f6/f6a0a79bb4a48ab28e6c3572d4511bb2 differ diff --git a/clock/Library/Artifacts/f6/f6b6d92af9b21dac2a7f4e113e9bff70 b/clock/Library/Artifacts/f6/f6b6d92af9b21dac2a7f4e113e9bff70 new file mode 100644 index 00000000..606ae006 Binary files /dev/null and b/clock/Library/Artifacts/f6/f6b6d92af9b21dac2a7f4e113e9bff70 differ diff --git a/clock/Library/Artifacts/f6/f6cc5fc7c85f46ab6a83786c58fd744a b/clock/Library/Artifacts/f6/f6cc5fc7c85f46ab6a83786c58fd744a new file mode 100644 index 00000000..a42a1250 Binary files /dev/null and b/clock/Library/Artifacts/f6/f6cc5fc7c85f46ab6a83786c58fd744a differ diff --git a/clock/Library/Artifacts/f6/f6e44bcfa547cf34cbde67029cc9eee9 b/clock/Library/Artifacts/f6/f6e44bcfa547cf34cbde67029cc9eee9 new file mode 100644 index 00000000..232fb47d Binary files /dev/null and b/clock/Library/Artifacts/f6/f6e44bcfa547cf34cbde67029cc9eee9 differ diff --git a/clock/Library/Artifacts/f6/f6f6faf1325b7d31d98ccaf64ccebf1c b/clock/Library/Artifacts/f6/f6f6faf1325b7d31d98ccaf64ccebf1c new file mode 100644 index 00000000..49ce0104 Binary files /dev/null and b/clock/Library/Artifacts/f6/f6f6faf1325b7d31d98ccaf64ccebf1c differ diff --git a/clock/Library/Artifacts/f7/f7124e80a00e0e8b0c839ecb50654ba9 b/clock/Library/Artifacts/f7/f7124e80a00e0e8b0c839ecb50654ba9 new file mode 100644 index 00000000..fa2567fa Binary files /dev/null and b/clock/Library/Artifacts/f7/f7124e80a00e0e8b0c839ecb50654ba9 differ diff --git a/clock/Library/Artifacts/f7/f7274cf6ca8b359c12d58e6e7e7408f4 b/clock/Library/Artifacts/f7/f7274cf6ca8b359c12d58e6e7e7408f4 new file mode 100644 index 00000000..4e07cce2 Binary files /dev/null and b/clock/Library/Artifacts/f7/f7274cf6ca8b359c12d58e6e7e7408f4 differ diff --git a/clock/Library/Artifacts/f7/f75241f7a23c61e7d97ab7e00e2fd530 b/clock/Library/Artifacts/f7/f75241f7a23c61e7d97ab7e00e2fd530 new file mode 100644 index 00000000..3245154a Binary files /dev/null and b/clock/Library/Artifacts/f7/f75241f7a23c61e7d97ab7e00e2fd530 differ diff --git a/clock/Library/Artifacts/f7/f75853e7eeb98f9cfd9a30d960bfb9ab b/clock/Library/Artifacts/f7/f75853e7eeb98f9cfd9a30d960bfb9ab new file mode 100644 index 00000000..032bb93d Binary files /dev/null and b/clock/Library/Artifacts/f7/f75853e7eeb98f9cfd9a30d960bfb9ab differ diff --git a/clock/Library/Artifacts/f7/f7abf8d4b0fddfca0fe7e5a5338a5439 b/clock/Library/Artifacts/f7/f7abf8d4b0fddfca0fe7e5a5338a5439 new file mode 100644 index 00000000..f4094dbc Binary files /dev/null and b/clock/Library/Artifacts/f7/f7abf8d4b0fddfca0fe7e5a5338a5439 differ diff --git a/clock/Library/Artifacts/f8/f833d3db95df2273acc9c08f4564a021 b/clock/Library/Artifacts/f8/f833d3db95df2273acc9c08f4564a021 new file mode 100644 index 00000000..52b20507 Binary files /dev/null and b/clock/Library/Artifacts/f8/f833d3db95df2273acc9c08f4564a021 differ diff --git a/clock/Library/Artifacts/f8/f8a4c678d511f1ea2520e0edcc6f460a b/clock/Library/Artifacts/f8/f8a4c678d511f1ea2520e0edcc6f460a new file mode 100644 index 00000000..c5d842fa Binary files /dev/null and b/clock/Library/Artifacts/f8/f8a4c678d511f1ea2520e0edcc6f460a differ diff --git a/clock/Library/Artifacts/f8/f8c2dba26200c96ea7bd86f6fcaa24f8 b/clock/Library/Artifacts/f8/f8c2dba26200c96ea7bd86f6fcaa24f8 new file mode 100644 index 00000000..d6c09bb0 Binary files /dev/null and b/clock/Library/Artifacts/f8/f8c2dba26200c96ea7bd86f6fcaa24f8 differ diff --git a/clock/Library/Artifacts/f9/f9075ce0f07b40dfddb2790f6e1c2eb5 b/clock/Library/Artifacts/f9/f9075ce0f07b40dfddb2790f6e1c2eb5 new file mode 100644 index 00000000..0b0c07a7 Binary files /dev/null and b/clock/Library/Artifacts/f9/f9075ce0f07b40dfddb2790f6e1c2eb5 differ diff --git a/clock/Library/Artifacts/f9/f934ad3ec259e442045763fa27043bf7 b/clock/Library/Artifacts/f9/f934ad3ec259e442045763fa27043bf7 new file mode 100644 index 00000000..b5c68365 Binary files /dev/null and b/clock/Library/Artifacts/f9/f934ad3ec259e442045763fa27043bf7 differ diff --git a/clock/Library/Artifacts/f9/f97133de774d064f62b388f7bfbd4efd b/clock/Library/Artifacts/f9/f97133de774d064f62b388f7bfbd4efd new file mode 100644 index 00000000..bf9d6baa Binary files /dev/null and b/clock/Library/Artifacts/f9/f97133de774d064f62b388f7bfbd4efd differ diff --git a/clock/Library/Artifacts/f9/f9b3a09b7d950fdab53299c4dbfebae6 b/clock/Library/Artifacts/f9/f9b3a09b7d950fdab53299c4dbfebae6 new file mode 100644 index 00000000..f2113023 Binary files /dev/null and b/clock/Library/Artifacts/f9/f9b3a09b7d950fdab53299c4dbfebae6 differ diff --git a/clock/Library/Artifacts/f9/f9d7705f5cd923d5dcdd861e642c7d6d b/clock/Library/Artifacts/f9/f9d7705f5cd923d5dcdd861e642c7d6d new file mode 100644 index 00000000..32b70580 Binary files /dev/null and b/clock/Library/Artifacts/f9/f9d7705f5cd923d5dcdd861e642c7d6d differ diff --git a/clock/Library/Artifacts/f9/f9fe31f111b4518c666f085009a2500f b/clock/Library/Artifacts/f9/f9fe31f111b4518c666f085009a2500f new file mode 100644 index 00000000..bcbfd847 Binary files /dev/null and b/clock/Library/Artifacts/f9/f9fe31f111b4518c666f085009a2500f differ diff --git a/clock/Library/Artifacts/fa/fa00d416af43b94d9bf1242bf44c5f68 b/clock/Library/Artifacts/fa/fa00d416af43b94d9bf1242bf44c5f68 new file mode 100644 index 00000000..403bff86 Binary files /dev/null and b/clock/Library/Artifacts/fa/fa00d416af43b94d9bf1242bf44c5f68 differ diff --git a/clock/Library/Artifacts/fa/fa712b8db8087773393e5491ccf8a0e9 b/clock/Library/Artifacts/fa/fa712b8db8087773393e5491ccf8a0e9 new file mode 100644 index 00000000..45751718 Binary files /dev/null and b/clock/Library/Artifacts/fa/fa712b8db8087773393e5491ccf8a0e9 differ diff --git a/clock/Library/Artifacts/fa/faafb2fc3be02fec46cfa5c129fd57b6 b/clock/Library/Artifacts/fa/faafb2fc3be02fec46cfa5c129fd57b6 new file mode 100644 index 00000000..f9dff941 Binary files /dev/null and b/clock/Library/Artifacts/fa/faafb2fc3be02fec46cfa5c129fd57b6 differ diff --git a/clock/Library/Artifacts/fa/fad4d0eaeae112d867393eecf09817e7 b/clock/Library/Artifacts/fa/fad4d0eaeae112d867393eecf09817e7 new file mode 100644 index 00000000..b4ef869c Binary files /dev/null and b/clock/Library/Artifacts/fa/fad4d0eaeae112d867393eecf09817e7 differ diff --git a/clock/Library/Artifacts/fb/fb3dbe7544a7c378273fc8af6fdd22db b/clock/Library/Artifacts/fb/fb3dbe7544a7c378273fc8af6fdd22db new file mode 100644 index 00000000..cf765d7c Binary files /dev/null and b/clock/Library/Artifacts/fb/fb3dbe7544a7c378273fc8af6fdd22db differ diff --git a/clock/Library/Artifacts/fb/fb5772bdd41b9f8b60d250461965df07 b/clock/Library/Artifacts/fb/fb5772bdd41b9f8b60d250461965df07 new file mode 100644 index 00000000..c4096924 Binary files /dev/null and b/clock/Library/Artifacts/fb/fb5772bdd41b9f8b60d250461965df07 differ diff --git a/clock/Library/Artifacts/fb/fb6ff068b11538f5fd52571e34da9940 b/clock/Library/Artifacts/fb/fb6ff068b11538f5fd52571e34da9940 new file mode 100644 index 00000000..0451e3ee Binary files /dev/null and b/clock/Library/Artifacts/fb/fb6ff068b11538f5fd52571e34da9940 differ diff --git a/clock/Library/Artifacts/fb/fb8549a1519ef011ce19d60d1aea0e18 b/clock/Library/Artifacts/fb/fb8549a1519ef011ce19d60d1aea0e18 new file mode 100644 index 00000000..9e14e44a Binary files /dev/null and b/clock/Library/Artifacts/fb/fb8549a1519ef011ce19d60d1aea0e18 differ diff --git a/clock/Library/Artifacts/fb/fb8f5f097c97a2bfebd3107cf81c1d3f b/clock/Library/Artifacts/fb/fb8f5f097c97a2bfebd3107cf81c1d3f new file mode 100644 index 00000000..b74807d9 Binary files /dev/null and b/clock/Library/Artifacts/fb/fb8f5f097c97a2bfebd3107cf81c1d3f differ diff --git a/clock/Library/Artifacts/fb/fb94b5bef7601acf1efde65d52429c78 b/clock/Library/Artifacts/fb/fb94b5bef7601acf1efde65d52429c78 new file mode 100644 index 00000000..9a4c7a33 Binary files /dev/null and b/clock/Library/Artifacts/fb/fb94b5bef7601acf1efde65d52429c78 differ diff --git a/clock/Library/Artifacts/fb/fb965ff59b846826e79da2124e705147 b/clock/Library/Artifacts/fb/fb965ff59b846826e79da2124e705147 new file mode 100644 index 00000000..2a3644a4 Binary files /dev/null and b/clock/Library/Artifacts/fb/fb965ff59b846826e79da2124e705147 differ diff --git a/clock/Library/Artifacts/fb/fb9b9b0a0ecfd574255e9d90ca9b0262 b/clock/Library/Artifacts/fb/fb9b9b0a0ecfd574255e9d90ca9b0262 new file mode 100644 index 00000000..63e431f7 Binary files /dev/null and b/clock/Library/Artifacts/fb/fb9b9b0a0ecfd574255e9d90ca9b0262 differ diff --git a/clock/Library/Artifacts/fb/fba854a101d2a556ad7d80a6fa6bd495 b/clock/Library/Artifacts/fb/fba854a101d2a556ad7d80a6fa6bd495 new file mode 100644 index 00000000..2353889f Binary files /dev/null and b/clock/Library/Artifacts/fb/fba854a101d2a556ad7d80a6fa6bd495 differ diff --git a/clock/Library/Artifacts/fb/fbc31d0372e95e9e4cb4bef559687c0d b/clock/Library/Artifacts/fb/fbc31d0372e95e9e4cb4bef559687c0d new file mode 100644 index 00000000..76bef0d1 Binary files /dev/null and b/clock/Library/Artifacts/fb/fbc31d0372e95e9e4cb4bef559687c0d differ diff --git a/clock/Library/Artifacts/fb/fbc357be8cde7a3088398741ece804d3 b/clock/Library/Artifacts/fb/fbc357be8cde7a3088398741ece804d3 new file mode 100644 index 00000000..8a81b336 Binary files /dev/null and b/clock/Library/Artifacts/fb/fbc357be8cde7a3088398741ece804d3 differ diff --git a/clock/Library/Artifacts/fb/fbf22c260d2879c09d22479b7da37871 b/clock/Library/Artifacts/fb/fbf22c260d2879c09d22479b7da37871 new file mode 100644 index 00000000..7cfdfbb1 Binary files /dev/null and b/clock/Library/Artifacts/fb/fbf22c260d2879c09d22479b7da37871 differ diff --git a/clock/Library/Artifacts/fc/fc0f48a7da5c647134100cf0087504e2 b/clock/Library/Artifacts/fc/fc0f48a7da5c647134100cf0087504e2 new file mode 100644 index 00000000..251edf36 Binary files /dev/null and b/clock/Library/Artifacts/fc/fc0f48a7da5c647134100cf0087504e2 differ diff --git a/clock/Library/Artifacts/fc/fc3ea1f0a3557bf7f0489b37e6f744e0 b/clock/Library/Artifacts/fc/fc3ea1f0a3557bf7f0489b37e6f744e0 new file mode 100644 index 00000000..d0e82b34 Binary files /dev/null and b/clock/Library/Artifacts/fc/fc3ea1f0a3557bf7f0489b37e6f744e0 differ diff --git a/clock/Library/Artifacts/fc/fc594457b2d4aa0e4b72772e5e906936 b/clock/Library/Artifacts/fc/fc594457b2d4aa0e4b72772e5e906936 new file mode 100644 index 00000000..22764b2b Binary files /dev/null and b/clock/Library/Artifacts/fc/fc594457b2d4aa0e4b72772e5e906936 differ diff --git a/clock/Library/Artifacts/fc/fc6feb7626df851817e1612c43a23680 b/clock/Library/Artifacts/fc/fc6feb7626df851817e1612c43a23680 new file mode 100644 index 00000000..966aac25 Binary files /dev/null and b/clock/Library/Artifacts/fc/fc6feb7626df851817e1612c43a23680 differ diff --git a/clock/Library/Artifacts/fc/fc8eac8bb22d45087c0256fdfbf0f4b3 b/clock/Library/Artifacts/fc/fc8eac8bb22d45087c0256fdfbf0f4b3 new file mode 100644 index 00000000..8356559c Binary files /dev/null and b/clock/Library/Artifacts/fc/fc8eac8bb22d45087c0256fdfbf0f4b3 differ diff --git a/clock/Library/Artifacts/fc/fc987fc24a13b5f8156aad5a8fe99ac7 b/clock/Library/Artifacts/fc/fc987fc24a13b5f8156aad5a8fe99ac7 new file mode 100644 index 00000000..5357cd25 Binary files /dev/null and b/clock/Library/Artifacts/fc/fc987fc24a13b5f8156aad5a8fe99ac7 differ diff --git a/clock/Library/Artifacts/fc/fcc369e8147b4b65446223954dd8b46a b/clock/Library/Artifacts/fc/fcc369e8147b4b65446223954dd8b46a new file mode 100644 index 00000000..781ea97c Binary files /dev/null and b/clock/Library/Artifacts/fc/fcc369e8147b4b65446223954dd8b46a differ diff --git a/clock/Library/Artifacts/fc/fcefe457280e1b20bf2912badccf6bf8 b/clock/Library/Artifacts/fc/fcefe457280e1b20bf2912badccf6bf8 new file mode 100644 index 00000000..5da373dd Binary files /dev/null and b/clock/Library/Artifacts/fc/fcefe457280e1b20bf2912badccf6bf8 differ diff --git a/clock/Library/Artifacts/fd/fd1910c74251c0c6f9c777c868af57a9 b/clock/Library/Artifacts/fd/fd1910c74251c0c6f9c777c868af57a9 new file mode 100644 index 00000000..c7edb649 Binary files /dev/null and b/clock/Library/Artifacts/fd/fd1910c74251c0c6f9c777c868af57a9 differ diff --git a/clock/Library/Artifacts/fd/fd1f8335eac3be391b4740e0effa9f52 b/clock/Library/Artifacts/fd/fd1f8335eac3be391b4740e0effa9f52 new file mode 100644 index 00000000..4f46daaa Binary files /dev/null and b/clock/Library/Artifacts/fd/fd1f8335eac3be391b4740e0effa9f52 differ diff --git a/clock/Library/Artifacts/fd/fd46cefc90c49cc9fb06f5b1ebfba198 b/clock/Library/Artifacts/fd/fd46cefc90c49cc9fb06f5b1ebfba198 new file mode 100644 index 00000000..003ddf3f Binary files /dev/null and b/clock/Library/Artifacts/fd/fd46cefc90c49cc9fb06f5b1ebfba198 differ diff --git a/clock/Library/Artifacts/fd/fd4aa891e185ff99be4f797e95683b45 b/clock/Library/Artifacts/fd/fd4aa891e185ff99be4f797e95683b45 new file mode 100644 index 00000000..7a577aa7 Binary files /dev/null and b/clock/Library/Artifacts/fd/fd4aa891e185ff99be4f797e95683b45 differ diff --git a/clock/Library/Artifacts/fd/fd51ca6a9a03eb18fc832fbeba867527 b/clock/Library/Artifacts/fd/fd51ca6a9a03eb18fc832fbeba867527 new file mode 100644 index 00000000..60a90ea1 Binary files /dev/null and b/clock/Library/Artifacts/fd/fd51ca6a9a03eb18fc832fbeba867527 differ diff --git a/clock/Library/Artifacts/fd/fd625657d129b8435888785d3d2d3000 b/clock/Library/Artifacts/fd/fd625657d129b8435888785d3d2d3000 new file mode 100644 index 00000000..bd79f56e Binary files /dev/null and b/clock/Library/Artifacts/fd/fd625657d129b8435888785d3d2d3000 differ diff --git a/clock/Library/Artifacts/fd/fd76f675f422d5030a3094eb5fbac599 b/clock/Library/Artifacts/fd/fd76f675f422d5030a3094eb5fbac599 new file mode 100644 index 00000000..8d3275d4 Binary files /dev/null and b/clock/Library/Artifacts/fd/fd76f675f422d5030a3094eb5fbac599 differ diff --git a/clock/Library/Artifacts/fd/fdad2dde8f70f58ab89b763bd2e813e5 b/clock/Library/Artifacts/fd/fdad2dde8f70f58ab89b763bd2e813e5 new file mode 100644 index 00000000..e7ad84b8 Binary files /dev/null and b/clock/Library/Artifacts/fd/fdad2dde8f70f58ab89b763bd2e813e5 differ diff --git a/clock/Library/Artifacts/fd/fdb49bb1528949372ae98385f530ed19 b/clock/Library/Artifacts/fd/fdb49bb1528949372ae98385f530ed19 new file mode 100644 index 00000000..442b9a3c Binary files /dev/null and b/clock/Library/Artifacts/fd/fdb49bb1528949372ae98385f530ed19 differ diff --git a/clock/Library/Artifacts/fe/fe08241d5e32730cd494e03886612005 b/clock/Library/Artifacts/fe/fe08241d5e32730cd494e03886612005 new file mode 100644 index 00000000..9b9fcbee Binary files /dev/null and b/clock/Library/Artifacts/fe/fe08241d5e32730cd494e03886612005 differ diff --git a/clock/Library/Artifacts/fe/fe70e6ce432ca81e89705c9b71e7caac b/clock/Library/Artifacts/fe/fe70e6ce432ca81e89705c9b71e7caac new file mode 100644 index 00000000..935bafc9 Binary files /dev/null and b/clock/Library/Artifacts/fe/fe70e6ce432ca81e89705c9b71e7caac differ diff --git a/clock/Library/Artifacts/fe/fe75367b313f8e8172de62d954a0bc60 b/clock/Library/Artifacts/fe/fe75367b313f8e8172de62d954a0bc60 new file mode 100644 index 00000000..6b7811c0 Binary files /dev/null and b/clock/Library/Artifacts/fe/fe75367b313f8e8172de62d954a0bc60 differ diff --git a/clock/Library/Artifacts/fe/fe9d9e8198767a30c09b641987b59a1f b/clock/Library/Artifacts/fe/fe9d9e8198767a30c09b641987b59a1f new file mode 100644 index 00000000..339ea934 Binary files /dev/null and b/clock/Library/Artifacts/fe/fe9d9e8198767a30c09b641987b59a1f differ diff --git a/clock/Library/Artifacts/ff/ff0c98aa9a60fbdf82d8b56c257a0cc6 b/clock/Library/Artifacts/ff/ff0c98aa9a60fbdf82d8b56c257a0cc6 new file mode 100644 index 00000000..a1c33e27 Binary files /dev/null and b/clock/Library/Artifacts/ff/ff0c98aa9a60fbdf82d8b56c257a0cc6 differ diff --git a/clock/Library/Artifacts/ff/ff38124063d5d27ecdcfbc11871c613a b/clock/Library/Artifacts/ff/ff38124063d5d27ecdcfbc11871c613a new file mode 100644 index 00000000..9e5b9d7c Binary files /dev/null and b/clock/Library/Artifacts/ff/ff38124063d5d27ecdcfbc11871c613a differ diff --git a/clock/Library/Artifacts/ff/ff47b1b2f93218bee583c92542510735 b/clock/Library/Artifacts/ff/ff47b1b2f93218bee583c92542510735 new file mode 100644 index 00000000..5e3c113c Binary files /dev/null and b/clock/Library/Artifacts/ff/ff47b1b2f93218bee583c92542510735 differ diff --git a/clock/Library/Artifacts/ff/ff504b513acf22a79b848f00c79b76d4 b/clock/Library/Artifacts/ff/ff504b513acf22a79b848f00c79b76d4 new file mode 100644 index 00000000..60638133 Binary files /dev/null and b/clock/Library/Artifacts/ff/ff504b513acf22a79b848f00c79b76d4 differ diff --git a/clock/Library/Artifacts/ff/ffa238136db9affceacf388b6db73b79 b/clock/Library/Artifacts/ff/ffa238136db9affceacf388b6db73b79 new file mode 100644 index 00000000..2ad3124e Binary files /dev/null and b/clock/Library/Artifacts/ff/ffa238136db9affceacf388b6db73b79 differ diff --git a/clock/Library/AssetImportState b/clock/Library/AssetImportState new file mode 100644 index 00000000..21c67d7f --- /dev/null +++ b/clock/Library/AssetImportState @@ -0,0 +1 @@ +-2;0;0;0;-1 \ No newline at end of file diff --git a/clock/Library/BuildPlayer.prefs b/clock/Library/BuildPlayer.prefs new file mode 100644 index 00000000..e69de29b diff --git a/clock/Library/BuildSettings.asset b/clock/Library/BuildSettings.asset new file mode 100644 index 00000000..b989b870 Binary files /dev/null and b/clock/Library/BuildSettings.asset differ diff --git a/clock/Library/CurrentLayout-default.dwlt b/clock/Library/CurrentLayout-default.dwlt new file mode 100644 index 00000000..95a261a4 --- /dev/null +++ b/clock/Library/CurrentLayout-default.dwlt @@ -0,0 +1,763 @@ +%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: 0 + y: 43 + width: 2560 + height: 1357 + m_ShowMode: 4 + m_Title: + m_RootView: {fileID: 6} + m_MinSize: {x: 875, y: 371} + m_MaxSize: {x: 10000, y: 10000} + m_Maximized: 1 +--- !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: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 9} + - {fileID: 3} + m_Position: + serializedVersion: 2 + x: 0 + y: 30 + width: 2560 + height: 1307 + m_MinSize: {x: 677, y: 321} + m_MaxSize: {x: 12002, y: 8021} + vertical: 0 + controlID: 85 +--- !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: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 2041 + y: 0 + width: 519 + height: 1307 + m_MinSize: {x: 275, y: 50} + m_MaxSize: {x: 4000, y: 4000} + m_ActualView: {fileID: 14} + m_Panes: + - {fileID: 14} + m_Selected: 0 + m_LastSelected: 0 +--- !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: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 506 + height: 789 + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_ActualView: {fileID: 15} + m_Panes: + - {fileID: 15} + m_Selected: 0 + m_LastSelected: 0 +--- !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: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: ConsoleWindow + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 789 + width: 2041 + height: 518 + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} + m_ActualView: {fileID: 18} + m_Panes: + - {fileID: 13} + - {fileID: 18} + m_Selected: 1 + m_LastSelected: 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: 12008, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 7} + - {fileID: 2} + - {fileID: 8} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 2560 + height: 1357 + m_MinSize: {x: 875, y: 371} + m_MaxSize: {x: 10000, y: 10000} +--- !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: 1 + m_Script: {fileID: 12011, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 2560 + height: 30 + m_MinSize: {x: 0, y: 0} + m_MaxSize: {x: 0, y: 0} + m_LastLoadedLayoutName: +--- !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: 12042, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 1337 + width: 2560 + height: 20 + m_MinSize: {x: 0, y: 0} + m_MaxSize: {x: 0, y: 0} +--- !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: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 10} + - {fileID: 5} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 2041 + height: 1307 + m_MinSize: {x: 402, y: 321} + m_MaxSize: {x: 8002, y: 8021} + vertical: 1 + controlID: 86 +--- !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: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 4} + - {fileID: 11} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 2041 + height: 789 + m_MinSize: {x: 402, y: 221} + m_MaxSize: {x: 8002, y: 4021} + vertical: 0 + controlID: 22 +--- !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: SceneView + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 506 + y: 0 + width: 1535 + height: 789 + m_MinSize: {x: 202, y: 221} + m_MaxSize: {x: 4002, y: 4021} + m_ActualView: {fileID: 16} + m_Panes: + - {fileID: 16} + - {fileID: 17} + - {fileID: 12} + m_Selected: 0 + m_LastSelected: 1 +--- !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: 1 + m_Script: {fileID: 12111, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 400, y: 100} + m_MaxSize: {x: 2048, y: 2048} + m_TitleContent: + m_Text: Asset Store + m_Image: {fileID: -8693916549880196297, guid: 0000000000000000d000000000000000, + type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 468 + y: 181 + width: 973 + height: 501 + m_ViewDataDictionary: {fileID: 0} +--- !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: 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: 0 + y: 862 + width: 2040 + height: 497 + 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/Skrypty + m_ViewMode: 1 + m_StartGridSize: 64 + m_LastFolders: + - Assets/Skrypty + m_LastFoldersGridSize: -1 + m_LastProjectPath: E:\Unity\MWS1 + m_LockTracker: + m_IsLocked: 0 + m_FolderTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: 28340000 + m_LastClickedID: 13352 + m_ExpandedIDs: 000000000434000006340000 + 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: 0} + 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: 000000000434000006340000 + 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: 0} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_ListAreaState: + m_SelectedInstanceIDs: b02e0000 + m_LastClickedInstanceID: 11952 + m_HadKeyboardFocusLastEvent: 1 + m_ExpandedInstanceIDs: c6230000 + 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: 5} + 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: 64 + m_SkipHiddenPackages: 0 + m_DirectoriesAreaWidth: 229 +--- !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: 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: 2041 + y: 73 + width: 518 + height: 1286 + m_ViewDataDictionary: {fileID: 0} + m_OpenAddComponentMenu: 0 + m_ObjectsLockedBeforeSerialization: [] + m_InstanceIDsLockedBeforeSerialization: + m_LockTracker: + m_IsLocked: 0 + m_PreviewResizer: + m_CachedPref: 160 + m_ControlHash: -371814159 + m_PrefName: Preview_InspectorPreview + m_PreviewWindow: {fileID: 0} + m_LastInspectedObjectInstanceID: -1 + m_LastVerticalScrollValue: 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: 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: 0 + y: 73 + width: 505 + height: 768 + m_ViewDataDictionary: {fileID: 0} + m_SceneHierarchy: + m_TreeViewState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: + m_LastClickedID: 0 + m_ExpandedIDs: 68fbffff + 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: 4} + m_SearchString: + m_ExpandedScenes: [] + m_CurrenRootInstanceID: 0 + m_LockTracker: + m_IsLocked: 0 + m_CurrentSortingName: TransformSorting + m_WindowGUID: 88edb364a1ed54e4ebe779b3a18bfe0d +--- !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: 506 + y: 73 + width: 1533 + height: 768 + m_ViewDataDictionary: {fileID: 0} + m_ShowContextualTools: 0 + m_WindowGUID: 8eaf62c14fe5dc9459d55396cde66ca2 + m_Gizmos: 1 + m_SceneIsLit: 1 + m_SceneLighting: 1 + m_2DMode: 0 + m_isRotationLocked: 0 + m_PlayAudio: 0 + m_AudioPlay: 0 + m_Position: + m_Target: {x: -1.4425168, y: 4.255652, z: -1.4969139} + speed: 2 + m_Value: {x: -1.4425168, y: 4.255652, z: -1.4969139} + 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: 0 + 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: 1 + 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} + zGrid: + 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} + m_ShowGrid: 1 + m_GridAxis: 1 + m_gridOpacity: 0.5 + m_Rotation: + m_Target: {x: -0.05823995, y: 0.9353393, z: -0.18358213, w: -0.29672888} + speed: 2 + m_Value: {x: -0.058239896, y: 0.9353384, z: -0.18358195, w: -0.2967286} + m_Size: + m_Target: 11.312846 + speed: 2 + m_Value: 11.312846 + m_Ortho: + m_Target: 0 + speed: 2 + m_Value: 0 + m_CameraSettings: + m_Speed: 1 + m_SpeedNormalized: 0.5 + 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, y: 0, z: 0, w: 0} + m_LastSceneViewOrtho: 0 + m_ReplacementShader: {fileID: 0} + m_ReplacementString: + m_SceneVisActive: 1 + 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: 1 + m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + 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: 506 + y: 73 + width: 1533 + height: 768 + 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: 1533, y: 747} + 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: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 + m_ZoomArea: + m_HRangeLocked: 0 + m_VRangeLocked: 0 + hZoomLockedByDefault: 0 + vZoomLockedByDefault: 0 + m_HBaseRangeMin: -766.5 + m_HBaseRangeMax: 766.5 + m_VBaseRangeMin: -373.5 + m_VBaseRangeMax: 373.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: 0 + m_EnableSliderZoomHorizontal: 0 + m_EnableSliderZoomVertical: 0 + m_UniformScale: 1 + m_UpDirection: 1 + m_DrawArea: + serializedVersion: 2 + x: 0 + y: 21 + width: 1533 + height: 747 + m_Scale: {x: 1, y: 1} + m_Translation: {x: 766.5, y: 373.5} + m_MarginLeft: 0 + m_MarginRight: 0 + m_MarginTop: 0 + m_MarginBottom: 0 + m_LastShownAreaInsideMargins: + serializedVersion: 2 + x: -766.5 + y: -373.5 + width: 1533 + height: 747 + m_MinimalGUI: 1 + m_defaultScale: 1 + m_LastWindowPixelSize: {x: 1533, y: 768} + m_ClearInEditMode: 1 + m_NoCameraWarning: 1 + m_LowResolutionForAspectRatios: 01000000000000000000 + m_XRRenderMode: 0 + m_RenderTexture: {fileID: 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: 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: 0 + y: 862 + width: 2040 + height: 497 + m_ViewDataDictionary: {fileID: 0} diff --git a/clock/Library/EditorOnlyScriptingSettings.json b/clock/Library/EditorOnlyScriptingSettings.json new file mode 100644 index 00000000..8e1824c8 --- /dev/null +++ b/clock/Library/EditorOnlyScriptingSettings.json @@ -0,0 +1 @@ +{"m_DefineSymbols":[],"m_AllowUnsafeCode":false} \ No newline at end of file diff --git a/clock/Library/EditorSnapSettings.asset b/clock/Library/EditorSnapSettings.asset new file mode 100644 index 00000000..7a90624e --- /dev/null +++ b/clock/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/clock/Library/EditorUserBuildSettings.asset b/clock/Library/EditorUserBuildSettings.asset new file mode 100644 index 00000000..1b592792 Binary files /dev/null and b/clock/Library/EditorUserBuildSettings.asset differ diff --git a/clock/Library/EditorUserSettings.asset b/clock/Library/EditorUserSettings.asset new file mode 100644 index 00000000..4681d1d2 --- /dev/null +++ b/clock/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/clock/Library/InspectorExpandedItems.asset b/clock/Library/InspectorExpandedItems.asset new file mode 100644 index 00000000..6804978a Binary files /dev/null and b/clock/Library/InspectorExpandedItems.asset differ diff --git a/clock/Library/LastSceneManagerSetup.txt b/clock/Library/LastSceneManagerSetup.txt new file mode 100644 index 00000000..6a5704fe --- /dev/null +++ b/clock/Library/LastSceneManagerSetup.txt @@ -0,0 +1,5 @@ +sceneSetups: +- path: Assets/Scenes/SampleScene.unity + isLoaded: 1 + isActive: 1 + isSubScene: 0 diff --git a/clock/Library/LibraryFormatVersion.txt b/clock/Library/LibraryFormatVersion.txt new file mode 100644 index 00000000..6185f096 --- /dev/null +++ b/clock/Library/LibraryFormatVersion.txt @@ -0,0 +1,2 @@ +unityRebuildLibraryVersion: 11 +unityForwardCompatibleVersion: 40 diff --git a/clock/Library/MonoManager.asset b/clock/Library/MonoManager.asset new file mode 100644 index 00000000..7c160cba Binary files /dev/null and b/clock/Library/MonoManager.asset differ diff --git a/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/.npmignore b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/.npmignore new file mode 100644 index 00000000..1586aea7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md new file mode 100644 index 00000000..3c6c85d5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/CHANGELOG.md.meta new file mode 100644 index 00000000..38274a69 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md new file mode 100644 index 00000000..57808d56 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/DEPENDENCIES.md.meta new file mode 100644 index 00000000..24e45c2f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Documentation~/collab-proxy.md b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Documentation~/collab-proxy.md new file mode 100644 index 00000000..c1800d6a --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor.meta new file mode 100644 index 00000000..b54ca871 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs new file mode 100644 index 00000000..d7266b63 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/AssemblyInfo.cs.meta new file mode 100644 index 00000000..e384b318 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab.meta new file mode 100644 index 00000000..694fc4ea --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs new file mode 100644 index 00000000..029ce1c7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Bootstrap.cs.meta new file mode 100644 index 00000000..641d54b7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs new file mode 100644 index 00000000..c7f90aa1 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabAnalytics.cs.meta new file mode 100644 index 00000000..2f46e9bc --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs new file mode 100644 index 00000000..b855bce3 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabHistoryWindow.cs.meta new file mode 100644 index 00000000..74358d40 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs new file mode 100644 index 00000000..eebe4aca --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarButton.cs.meta new file mode 100644 index 00000000..949d8db9 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs new file mode 100644 index 00000000..27938750 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/CollabToolbarWindow.cs.meta new file mode 100644 index 00000000..b08bf2aa --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters.meta new file mode 100644 index 00000000..91331532 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs new file mode 100644 index 00000000..91d500be --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Presenters/CollabHistoryPresenter.cs.meta new file mode 100644 index 00000000..9c37ecd8 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views.meta new file mode 100644 index 00000000..f62ac6be --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs new file mode 100644 index 00000000..ac3754d2 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/BuildStatusButton.cs.meta new file mode 100644 index 00000000..d74a58af --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs new file mode 100644 index 00000000..e3bb05a6 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDown.cs.meta new file mode 100644 index 00000000..513b66bf --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs new file mode 100644 index 00000000..3ad43f23 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryDropDownItem.cs.meta new file mode 100644 index 00000000..10bf40eb --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs new file mode 100644 index 00000000..24e5d1dd --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItem.cs.meta new file mode 100644 index 00000000..290bd28e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs new file mode 100644 index 00000000..e7d7aa6c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryItemFactory.cs.meta new file mode 100644 index 00000000..3250d966 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs new file mode 100644 index 00000000..2b8fe652 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/CollabHistoryRevisionLine.cs.meta new file mode 100644 index 00000000..2659a3c3 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs new file mode 100644 index 00000000..fad3b824 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/HistoryProgressSpinner.cs.meta new file mode 100644 index 00000000..0ded4e8a --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs new file mode 100644 index 00000000..03239a33 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/ICollabHistoryItemFactory.cs.meta new file mode 100644 index 00000000..08e90856 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs new file mode 100644 index 00000000..472a70e7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/PagedListView.cs.meta new file mode 100644 index 00000000..565f7a2e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs new file mode 100644 index 00000000..9b50e7a5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Collab/Views/StatusView.cs.meta new file mode 100644 index 00000000..bb634b19 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources.meta new file mode 100644 index 00000000..01229c29 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles.meta new file mode 100644 index 00000000..0ff03824 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss new file mode 100644 index 00000000..b20f08e9 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryCommon.uss.meta new file mode 100644 index 00000000..035b6621 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss new file mode 100644 index 00000000..de436f89 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryDark.uss.meta new file mode 100644 index 00000000..35a7d097 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss new file mode 100644 index 00000000..3f9b85f3 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Resources/Styles/CollabHistoryLight.uss.meta new file mode 100644 index 00000000..28c860e5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef new file mode 100644 index 00000000..66511e1d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Editor/Unity.CollabProxy.Editor.asmdef.meta new file mode 100644 index 00000000..03ebeca0 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md new file mode 100644 index 00000000..31bde4e4 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/LICENSE.md.meta new file mode 100644 index 00000000..30f5c3a6 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md new file mode 100644 index 00000000..5cfbd88a --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/README.md.meta new file mode 100644 index 00000000..b3ad9937 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests.meta new file mode 100644 index 00000000..f43ddd35 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor.meta new file mode 100644 index 00000000..b80cefdb --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs new file mode 100644 index 00000000..ba79a204 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/HistoryTests.cs.meta new file mode 100644 index 00000000..d648a7ff --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef new file mode 100644 index 00000000..3467a9ed --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/Tests/Editor/Unity.CollabProxy.EditorTests.asmdef.meta new file mode 100644 index 00000000..57db5c7d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json new file mode 100644 index 00000000..34022740 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json.meta b/clock/Library/PackageCache/com.unity.collab-proxy@1.2.16/package.json.meta new file mode 100644 index 00000000..c52d0c60 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/.gitlab-ci.yml b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/.gitlab-ci.yml new file mode 100644 index 00000000..4c64e220 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/.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/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/CHANGELOG.md b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/CHANGELOG.md new file mode 100644 index 00000000..269a7c4e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/CHANGELOG.md @@ -0,0 +1,22 @@ +# Changelog +## [1.0.6] - 2020-11-30 +- isExplicitlyReferenced set to 0 (case 1296162) +## [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/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/CHANGELOG.md.meta b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/CHANGELOG.md.meta new file mode 100644 index 00000000..d91fbdec --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f49bbe06ffa5ae24abe32abdab430c24 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/Documentation~/ext.nunit.md b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/Documentation~/ext.nunit.md new file mode 100644 index 00000000..2a38b9d8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/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/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/LICENSE.md b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/LICENSE.md new file mode 100644 index 00000000..ccc1f59c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/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/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/LICENSE.md.meta b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/LICENSE.md.meta new file mode 100644 index 00000000..90df748f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f91a00d2dca52b843b2d50ccf750737d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/README.md b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/README.md new file mode 100644 index 00000000..2a38b9d8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/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/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/README.md.meta b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/README.md.meta new file mode 100644 index 00000000..e9a7f9fa --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5da62a0c1c5218c4aa16b74546a7822d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35.meta b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35.meta new file mode 100644 index 00000000..278a2faf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a36d8b72880a8004f96ac54ce4598ff9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35/unity-custom.meta b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35/unity-custom.meta new file mode 100644 index 00000000..750f82c9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35/unity-custom.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2347243c7aa3e224f9282dc94e6fc3b2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35/unity-custom/nunit.framework.dll b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35/unity-custom/nunit.framework.dll new file mode 100644 index 00000000..ac346cb9 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35/unity-custom/nunit.framework.dll differ diff --git a/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35/unity-custom/nunit.framework.dll.meta b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/net35/unity-custom/nunit.framework.dll.meta new file mode 100644 index 00000000..4d8a380f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/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: 1 + 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/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/package.json b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/package.json new file mode 100644 index 00000000..2ea221dd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/package.json @@ -0,0 +1,24 @@ +{ + "displayName": "Custom NUnit", + "name": "com.unity.ext.nunit", + "version": "1.0.6", + "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": "29ea4d6504a5f58fb3a6934db839aa80ae6d9d88" + }, + "relatedPackages": { + "com.unity.ext.nunit.tests": "1.0.6" + }, + "upmCi": { + "footprint": "e9f76bd265402773096bf08a8ffb51cd3d76f39a" + } +} diff --git a/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/package.json.meta b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/package.json.meta new file mode 100644 index 00000000..ad884925 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.ext.nunit@1.0.6/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8143d3a8390f2c64685e3bc272bd9e90 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/.editorconfig new file mode 100644 index 00000000..aca19790 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md new file mode 100644 index 00000000..c93c8737 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/CHANGELOG.md.meta new file mode 100644 index 00000000..344cac5d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md new file mode 100644 index 00000000..576d0963 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/CONTRIBUTING.md.meta new file mode 100644 index 00000000..81c20c6f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Documentation~/README.md new file mode 100644 index 00000000..9ddd6348 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md new file mode 100644 index 00000000..eb18dfb7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/LICENSE.md.meta new file mode 100644 index 00000000..be2f8e64 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider.meta new file mode 100644 index 00000000..cf6222de --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor.meta new file mode 100644 index 00000000..49130a6e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs new file mode 100644 index 00000000..6c04ea37 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Discovery.cs.meta new file mode 100644 index 00000000..ea4ef859 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs new file mode 100644 index 00000000..91e9624a --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/EditorPluginInterop.cs.meta new file mode 100644 index 00000000..fda18d39 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs new file mode 100644 index 00000000..19ef8ab1 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/LoggingLevel.cs.meta new file mode 100644 index 00000000..c0494f30 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs new file mode 100644 index 00000000..bda3fcb2 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PluginSettings.cs.meta new file mode 100644 index 00000000..279a4cca --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors.meta new file mode 100644 index 00000000..40cdc604 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs new file mode 100644 index 00000000..230633fe --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/PostProcessors/RiderAssetPostprocessor.cs.meta new file mode 100644 index 00000000..68658ccf --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration.meta new file mode 100644 index 00000000..37615b9f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs new file mode 100644 index 00000000..6ea51dcf --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/FileIOProvider.cs.meta new file mode 100644 index 00000000..2763839c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs new file mode 100644 index 00000000..476766e5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/GUIDProvider.cs.meta new file mode 100644 index 00000000..7b331f20 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs new file mode 100644 index 00000000..d0a26649 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs.meta new file mode 100644 index 00000000..4a0705c1 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs new file mode 100644 index 00000000..d481133b --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderInitializer.cs.meta new file mode 100644 index 00000000..11d46bcb --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs new file mode 100644 index 00000000..debee95b --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs.meta new file mode 100644 index 00000000..16764836 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs new file mode 100644 index 00000000..f75ed0d8 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditorData.cs.meta new file mode 100644 index 00000000..21a5abc7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting.meta new file mode 100644 index 00000000..f6e86c98 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs new file mode 100644 index 00000000..01573faf --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackData.cs.meta new file mode 100644 index 00000000..ce327225 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs new file mode 100644 index 00000000..10d528b7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/CallbackInitializer.cs.meta new file mode 100644 index 00000000..d47c38c9 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs new file mode 100644 index 00000000..e08c3465 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/RiderTestRunner.cs.meta new file mode 100644 index 00000000..6ef53130 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs new file mode 100644 index 00000000..ce2e1b7e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestEvent.cs.meta new file mode 100644 index 00000000..7ec7c71f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs new file mode 100644 index 00000000..9995050f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/UnitTesting/TestsCallback.cs.meta new file mode 100644 index 00000000..068cba1a --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util.meta new file mode 100644 index 00000000..d7ba88e9 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs new file mode 100644 index 00000000..c41490a4 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/CommandLineParser.cs.meta new file mode 100644 index 00000000..536d707f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs new file mode 100644 index 00000000..f558acac --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/FileSystemUtil.cs.meta new file mode 100644 index 00000000..ebc001b7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs new file mode 100644 index 00000000..a4070f28 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/LibcNativeInterop.cs.meta new file mode 100644 index 00000000..fe70ee09 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs new file mode 100644 index 00000000..63acff63 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/RiderMenu.cs.meta new file mode 100644 index 00000000..b78dfae8 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs new file mode 100644 index 00000000..03c9922e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/Util/UnityUtils.cs.meta new file mode 100644 index 00000000..9a4e6fe1 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef new file mode 100644 index 00000000..4caebc4e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/com.unity.ide.rider.asmdef.meta new file mode 100644 index 00000000..7a89700b --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json new file mode 100644 index 00000000..eb7d7d5e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta b/clock/Library/PackageCache/com.unity.ide.rider@1.1.4/package.json.meta new file mode 100644 index 00000000..11bcd7b9 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md new file mode 100644 index 00000000..20f40724 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/CHANGELOG.md.meta new file mode 100644 index 00000000..65aea0bb --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md new file mode 100644 index 00000000..576d0963 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/CONTRIBUTING.md.meta new file mode 100644 index 00000000..31e836f7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Documentation~/README.md b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Documentation~/README.md new file mode 100644 index 00000000..d0a565f7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor.meta new file mode 100644 index 00000000..568fa030 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration.meta new file mode 100644 index 00000000..48ed36c1 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs new file mode 100644 index 00000000..c442d876 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/AssemblyNameProvider.cs.meta new file mode 100644 index 00000000..a8ae38b5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs new file mode 100644 index 00000000..aeff22e5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/FileIO.cs.meta new file mode 100644 index 00000000..91d8212c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs new file mode 100644 index 00000000..06549664 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/GUIDGenerator.cs.meta new file mode 100644 index 00000000..9ce342e0 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs new file mode 100644 index 00000000..45527281 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGeneration.cs.meta new file mode 100644 index 00000000..5039705b --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs new file mode 100644 index 00000000..e51dd43f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/ProjectGeneration/ProjectGenerationFlag.cs.meta new file mode 100644 index 00000000..35bf0278 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef new file mode 100644 index 00000000..032da7cb --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/Unity.com.unity.vscode.Editor.asmdef.meta new file mode 100644 index 00000000..4c94f56d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs new file mode 100644 index 00000000..609d2cdf --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeDiscovery.cs.meta new file mode 100644 index 00000000..cbeca1b7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs new file mode 100644 index 00000000..7efc69fb --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/Editor/VSCodeScriptEditor.cs.meta new file mode 100644 index 00000000..a0aa5a48 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md new file mode 100644 index 00000000..eb18dfb7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/LICENSE.md.meta new file mode 100644 index 00000000..20c91bd9 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json new file mode 100644 index 00000000..6f6f1c14 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json.meta b/clock/Library/PackageCache/com.unity.ide.vscode@1.2.3/package.json.meta new file mode 100644 index 00000000..e5597112 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CHANGELOG.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CHANGELOG.md new file mode 100644 index 00000000..dd790dd6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CHANGELOG.md @@ -0,0 +1,187 @@ +# Changelog +## [1.1.22] - 2021-01-21 +- Fixed issue where test result of an explicit test was set to skipped in case it was passing and running from command line with testfilter set to the explicit test (DS-1236). +- Fixed an issue where tests located in assemblies that did not directly reference any test assemblies were not included (DSTR-30). +- Fixed an issue where UnitySetup methods were incorrectly being rerun when entering playmode, rather than being skipped (DSTR-68). +- Internal: Remove ##utp message AssemblyCompilationErrors (DS-1277) +- Fixed issue where if the timeout was exceeded in SetUp the timeout exception was not thrown(DSTR-21). +- Removed ability to `Enable playmode tests for all assemblies` from the TestRunner UI, since it is a deprecated behavior. It enforces to use of assembly definition files (DSTR-45). +- Fixed typo in `LogAssert.cs` documentation. + +## [1.1.21] - 2021-01-14 +- Fixed issue where test result of an explicit test was set to skipped in case it was passing and running from command line with testfilter set to the explicit test (DS-1236). +- Fixed an issue where tests located in assemblies that did not directly reference any test assemblies were not included (DSTR-30). +- Fixed an issue where UnitySetup methods were incorrectly being rerun when entering playmode, rather than being skipped (DSTR-68). +- Internal: Remove ##utp message AssemblyCompilationErrors (DS-1277) +- Fixed issue where if the timeout was exceeded in SetUp the timeout exception was not thrown(DSTR-21). +- Removed ability to `Enable playmode tests for all assemblies` from the TestRunner UI, since it is a deprecated behavior. It enforces to use of assembly definition files (DSTR-45). + +## [1.1.20] - 2020-12-04 +- The logscope is now available in OneTimeTearDown. +- Fixed an issue where failing tests would not result in the correct exit code if a domain reload happens after the test has run (DS-1304). +- If a player build fails, the test specific build settings should be cleaned up and the original values restored as intended (DS-1001). +- Added better error message when using TestRunCallbackAttribute and the implementation is stripped away (DS-454). +- Fixed an issue where the test results xml would have a zero end-time for tests executed before a domain reload (DSTR-63). +- Fixed OpenSource in case of a Test in a nested class (DSTR-6) +- UnityTests with a domain reload now works correctly in combination with Retry and Repeat attributes (DS-428). +- Fixed OpenSource in case of Tests located inside a package (DS-432) + +## [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)`. +- Updating `com.unity.ext.nunit` version +- Method marked with UnityTest that are not returning IEnumerator is now giving a proper error (DS-1059). + +## [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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CHANGELOG.md.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CHANGELOG.md.meta new file mode 100644 index 00000000..4fca79ed --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d691174143fd3774ba63d7c493633b99 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CONTRIBUTING.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CONTRIBUTING.md new file mode 100644 index 00000000..9f299b10 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CONTRIBUTING.md.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CONTRIBUTING.md.meta new file mode 100644 index 00000000..39e850ae --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/CONTRIBUTING.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 57d2ac5c7d5786e499d4794973fe0d4e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/TableOfContents.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/TableOfContents.md new file mode 100644 index 00000000..3155c1fc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/edit-mode-vs-play-mode-tests.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/edit-mode-vs-play-mode-tests.md new file mode 100644 index 00000000..54596396 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/extending.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/extending.md new file mode 100644 index 00000000..045c94a8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/extension-get-test-results.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/extension-get-test-results.md new file mode 100644 index 00000000..8b71d7ed --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/extension-retrieve-test-list.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/extension-retrieve-test-list.md new file mode 100644 index 00000000..dedc7fab --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/extension-run-tests.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/extension-run-tests.md new file mode 100644 index 00000000..60ff3dc7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/getting-started.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/getting-started.md new file mode 100644 index 00000000..a8051f26 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-create-test-script.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-create-test-script.png new file mode 100644 index 00000000..fc9af556 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-create-test-script.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-run-test.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-run-test.png new file mode 100644 index 00000000..df1b53c5 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-run-test.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-run-tests.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-run-tests.png new file mode 100644 index 00000000..c890d815 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-run-tests.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-tab.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-tab.png new file mode 100644 index 00000000..e1b00d7a Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/editmode-tab.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/import-settings.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/import-settings.png new file mode 100644 index 00000000..6a34e924 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/import-settings.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/new-test-script.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/new-test-script.png new file mode 100644 index 00000000..21de0810 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/new-test-script.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-enable-all.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-enable-all.png new file mode 100644 index 00000000..961991ae Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-enable-all.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-results-standalone.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-results-standalone.png new file mode 100644 index 00000000..de40c031 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-results-standalone.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-run-standalone.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-run-standalone.png new file mode 100644 index 00000000..ded57927 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-run-standalone.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-tab.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-tab.png new file mode 100644 index 00000000..9d315cb9 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/playmode-tab.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/test-runner-window.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/test-runner-window.png new file mode 100644 index 00000000..f3023fb3 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/test-runner-window.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/test-templates.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/test-templates.png new file mode 100644 index 00000000..753a1552 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/test-templates.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/tests-folder-assembly.png b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/tests-folder-assembly.png new file mode 100644 index 00000000..4e63751b Binary files /dev/null and b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/images/tests-folder-assembly.png differ diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/index.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/index.md new file mode 100644 index 00000000..604a9163 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/manual.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/manual.md new file mode 100644 index 00000000..e50f7add --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-actions-outside-tests.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-actions-outside-tests.md new file mode 100644 index 00000000..252e157b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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"); + } + + [UnityTearDown] + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-conditionalignore.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-conditionalignore.md new file mode 100644 index 00000000..c051e018 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-testmustexpectalllogs.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-testmustexpectalllogs.md new file mode 100644 index 00000000..f0c46651 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-testplayerbuildmodifier.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-testplayerbuildmodifier.md new file mode 100644 index 00000000..4ab7ccb8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-testruncallback.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-testruncallback.md new file mode 100644 index 00000000..dad865a5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-unityplatform.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-unityplatform.md new file mode 100644 index 00000000..931ab878 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-unitytest.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-attribute-unitytest.md new file mode 100644 index 00000000..c25947bc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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 = RunEditorUtilityInTheBackground(); + + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-command-line.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-command-line.md new file mode 100644 index 00000000..09afbfe0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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. A semi-colon separated list should be formatted as a string enclosed in quotation marks, e.g. `testCategory="firstCategory;secondCategory"`. If using both `testFilter` and `testCategory`, then only tests that match both are run. 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. A semi-colon separated list should be formatted as a string enclosed in quotation marks, e.g. `testFilter="Low;Medium"`. 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. A semi-colon separated list should be formatted as a string enclosed in quotation marks, e.g. `assemblyNames="firstAssembly;secondAssembly"`. + +### 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-color.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-color.md new file mode 100644 index 00000000..f4ae57e6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-equals.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-equals.md new file mode 100644 index 00000000..cc5d4d64 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-float.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-float.md new file mode 100644 index 00000000..188d2075 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-quaternion.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-quaternion.md new file mode 100644 index 00000000..5d7abc86 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-vector2.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-vector2.md new file mode 100644 index 00000000..977879e2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-vector3.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-vector3.md new file mode 100644 index 00000000..6fe1122b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-vector4.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-comparer-vector4.md new file mode 100644 index 00000000..915cd65d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-assertion.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-assertion.md new file mode 100644 index 00000000..665597b8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-attributes.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-attributes.md new file mode 100644 index 00000000..115e4cb4 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-constraints.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-constraints.md new file mode 100644 index 00000000..10b205b9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-equality-comparers.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-equality-comparers.md new file mode 100644 index 00000000..8203a32f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-yield-instructions.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-custom-yield-instructions.md new file mode 100644 index 00000000..9814ca35 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-execution-settings.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-execution-settings.md new file mode 100644 index 00000000..e40a3334 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-filter.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-filter.md new file mode 100644 index 00000000..8cfa9107 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-icallbacks.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-icallbacks.md new file mode 100644 index 00000000..b04e7e82 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-ierror-callbacks.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-ierror-callbacks.md new file mode 100644 index 00000000..bf833091 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-itest-adaptor.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-itest-adaptor.md new file mode 100644 index 00000000..04e72f6f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-itest-result-adaptor.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-itest-result-adaptor.md new file mode 100644 index 00000000..63280f62 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-itest-run-settings.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-itest-run-settings.md new file mode 100644 index 00000000..79c344b5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-recompile-scripts.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-recompile-scripts.md new file mode 100644 index 00000000..0fb86446 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-setup-and-cleanup.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-setup-and-cleanup.md new file mode 100644 index 00000000..93e77a56 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-test-runner-api.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-test-runner-api.md new file mode 100644 index 00000000..b594f7ef --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-test-utils.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-test-utils.md new file mode 100644 index 00000000..24d4eec8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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 CheckThat_FloatsAreEqual() + { + float expected = 10e-8f; + float actual = 0f; + float allowedRelativeError = 10e-6f; + + Assert.That(Utils.AreFloatsEqual(expected, actual, allowedRelativeError), Is.True); + } + + [Test] + public void CheckThat_FloatsAreAbsoluteEqual() + { + float expected = 0f; + float actual = 10e-6f; + float error = 10e-5f; + + Assert.That(Utils.AreFloatsEqualAbsoluteError(expected, actual, error), Is.True); + } +} +``` + diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-tests-monobehaviour.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-tests-monobehaviour.md new file mode 100644 index 00000000..64093335 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-tests-parameterized.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-tests-parameterized.md new file mode 100644 index 00000000..6182bad6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-wait-for-domain-reload.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/reference-wait-for-domain-reload.md new file mode 100644 index 00000000..8d42e70d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/resources.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/resources.md new file mode 100644 index 00000000..ce261e95 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-create-playmode-test.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-create-playmode-test.md new file mode 100644 index 00000000..a21b6191 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-create-test-assembly.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-create-test-assembly.md new file mode 100644 index 00000000..eb358969 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-create-test.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-create-test.md new file mode 100644 index 00000000..612106ee --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-run-playmode-test-standalone.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-run-playmode-test-standalone.md new file mode 100644 index 00000000..0a2fa815 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-run-test.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/Documentation~/workflow-run-test.md new file mode 100644 index 00000000..506194b8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/LICENSE.md b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/LICENSE.md new file mode 100644 index 00000000..e6a38bf8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/LICENSE.md.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/LICENSE.md.meta new file mode 100644 index 00000000..f6a2ca23 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3ec7596410385054a9e0bc90377fbe63 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner.meta new file mode 100644 index 00000000..d1eb5739 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95cdf27b47eb82747ba9e51f41e72a35 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api.meta new file mode 100644 index 00000000..2ffb8f97 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fa423365b1ce06a4dbdc6fb4a8597bfa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksDelegator.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksDelegator.cs new file mode 100644 index 00000000..91f2d4cf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksDelegator.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksDelegator.cs.meta new file mode 100644 index 00000000..89e09046 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs new file mode 100644 index 00000000..c19621d5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksDelegatorListener.cs.meta new file mode 100644 index 00000000..c9bb94a3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksHolder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksHolder.cs new file mode 100644 index 00000000..5df378d5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksHolder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/CallbacksHolder.cs.meta new file mode 100644 index 00000000..7c420282 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ExecutionSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ExecutionSettings.cs new file mode 100644 index 00000000..4cbb34b0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ExecutionSettings.cs @@ -0,0 +1,77 @@ +using System; +using System.Linq; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal.Filters; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// A set of execution settings defining how to run tests, using the . + /// + [Serializable] + public class ExecutionSettings + { + /// + /// Creates an instance with a given set of filters, if any. + /// + /// Set of filters + public ExecutionSettings(params Filter[] filtersToExecute) + { + filters = filtersToExecute; + } + + [SerializeField] + internal BuildTarget? targetPlatform; + + /// + /// An instance of to set up before running tests on a Player. + /// + // Note: Is not available after serialization + public ITestRunSettings overloadTestRunSettings; + + [SerializeField] + internal Filter filter; + /// + ///A collection of to execute tests on. + /// + [SerializeField] + public Filter[] filters; + /// + /// 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. + /// + /// If true, the call to Execute() will run tests synchronously, guaranteeing that all tests have finished running by the time the call returns. + [SerializeField] + public bool runSynchronously; + /// + /// The time, in seconds, the editor should wait for heartbeats after starting a test run on a player. This defaults to 10 minutes. + /// + [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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ExecutionSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ExecutionSettings.cs.meta new file mode 100644 index 00000000..602a117c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/Filter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/Filter.cs new file mode 100644 index 00000000..2886abc0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/Filter.cs @@ -0,0 +1,56 @@ +using System; +using UnityEngine; +using UnityEngine.TestTools.TestRunner.GUI; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// The filter class provides the with a specification of what tests to run when [running tests programmatically](https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/manual/extension-run-tests.html). + /// + [Serializable] + public class Filter + { + /// + /// An enum flag that specifies if Edit Mode or Play Mode tests should run. + /// + [SerializeField] + public TestMode testMode; + /// + /// 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). + /// + [SerializeField] + public string[] testNames; + /// + /// 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. + /// + [SerializeField] + public string[] groupNames; + /// + /// 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. + /// + [SerializeField] + public string[] categoryNames; + /// + /// The name of assemblies included in the run. That is the assembly name, without the .dll file extension. E.g., MyTestAssembly + /// + [SerializeField] + public string[] assemblyNames; + /// + /// The platform to run the test on. If set to null, then the Editor is the target for the tests. + /// + [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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/Filter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/Filter.cs.meta new file mode 100644 index 00000000..bbb21b58 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacks.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacks.cs new file mode 100644 index 00000000..b045a392 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacks.cs @@ -0,0 +1,29 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// Callbacks in the for the test stages when running tests. + /// + public interface ICallbacks + { + /// + /// A callback invoked when a test run is started. + /// + /// The full loaded test tree. + void RunStarted(ITestAdaptor testsToRun); + /// + /// A callback invoked when a test run is finished. + /// + /// The result of the test run. + void RunFinished(ITestResultAdaptor result); + /// + /// A callback invoked when each individual node of the test tree has started executing. + /// + /// The test node currently executed. + void TestStarted(ITestAdaptor test); + /// + /// A callback invoked when each individual node of the test tree has finished executing. + /// + /// The result of the test tree node after it had been executed. + void TestFinished(ITestResultAdaptor result); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacks.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacks.cs.meta new file mode 100644 index 00000000..851e3f68 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs new file mode 100644 index 00000000..9005c460 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacksDelegator.cs.meta new file mode 100644 index 00000000..fb264591 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacksHolder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacksHolder.cs new file mode 100644 index 00000000..ff7128b0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacksHolder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ICallbacksHolder.cs.meta new file mode 100644 index 00000000..7f11d808 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/IErrorCallbacks.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/IErrorCallbacks.cs new file mode 100644 index 00000000..8e8782cb --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/IErrorCallbacks.cs @@ -0,0 +1,16 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// An extended version of the , which get invoked if the test run fails due to a build error or if any has a failure. + /// + public interface IErrorCallbacks : ICallbacks + { + /// + /// Method invoked on failure. + /// + /// + /// The error message detailing the reason for the run to fail. + /// + void OnError(string message); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/IErrorCallbacks.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/IErrorCallbacks.cs.meta new file mode 100644 index 00000000..34728c61 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestAdaptor.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestAdaptor.cs new file mode 100644 index 00000000..fa67d767 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestAdaptor.cs @@ -0,0 +1,100 @@ +using System.Collections.Generic; +using NUnit.Framework.Interfaces; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// ```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. + /// + public interface ITestAdaptor + { + /// + /// 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 Id { get; } + /// + /// The name of the test. E.g.,```MyTest```. + /// + string Name { get; } + /// + /// The full name of the test. E.g., ```MyNamespace.MyTestClass.MyTest```. + /// + string FullName { get; } + /// + /// The total number of test cases in the node and all sub-nodes. + /// + int TestCaseCount { get; } + /// + /// Whether the node has any children. + /// + bool HasChildren { get; } + /// + /// True if the node is a test suite/fixture, false otherwise. + /// + bool IsSuite { get; } + /// + /// The child nodes. + /// + IEnumerable Children { get; } + /// + /// The parent node, if any. + /// + ITestAdaptor Parent { get; } + /// + /// The test case timeout in milliseconds. Note that this value is only available on TestFinished. + /// + int TestCaseTimeout { get; } + /// + /// The type of test class as an ```NUnit``` . If the node is not a test class, then the value is null. + /// + ITypeInfo TypeInfo { get; } + /// + /// The Nunit of the test method. If the node is not a test method, then the value is null. + /// + IMethodInfo Method { get; } + /// + /// An array of the categories applied to the test or fixture. + /// + string[] Categories { get; } + /// + /// Returns true if the node represents a test assembly, false otherwise. + /// + bool IsTestAssembly { get; } + /// + /// The run state of the test node. Either ```NotRunnable```, ```Runnable```, ```Explicit```, ```Skipped```, or ```Ignored```. + /// + RunState RunState { get; } + /// + /// The description of the test. + /// + string Description { get; } + /// + /// The skip reason. E.g., if ignoring the test. + /// + string SkipReason { get; } + /// + /// The ID of the parent node. + /// + string ParentId { get; } + /// + /// The full name of the parent node. + /// + string ParentFullName { get; } + /// + /// A unique generated name for the test node. E.g., ```Tests.dll/MyNamespace/MyTestClass/[Tests][MyNamespace.MyTestClass.MyTest]```. + /// + string UniqueName { get; } + /// + /// A unique name of the parent node. E.g., ```Tests.dll/MyNamespace/[Tests][MyNamespace.MyTestClass][suite]```. + /// + string ParentUniqueName { get; } + /// + /// The child index of the node in its parent. + /// + int ChildIndex { get; } + /// + /// The mode of the test. Either **Edit Mode** or **Play Mode**. + /// + TestMode TestMode { get; } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestAdaptor.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestAdaptor.cs.meta new file mode 100644 index 00000000..2ae45afd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs new file mode 100644 index 00000000..021b3135 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestAdaptorFactory.cs.meta new file mode 100644 index 00000000..05dadbac --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs new file mode 100644 index 00000000..6dbac5b5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework.Interfaces; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// 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. + /// + public interface ITestResultAdaptor + { + /// + /// The test details of the test result tree node as a + /// + ITestAdaptor Test { get; } + /// + ///The name of the test node. + /// + string Name { get; } + /// + /// Gets the full name of the test result + /// + /// + ///The name of the test result. + /// + string FullName { get; } + /// + ///Gets the state of the result as a string. + /// + /// + ///It returns one of these values: `Success`, `Skipped`, `Failure`, `Explicit`, `Cancelled` + /// + string ResultState { get; } + /// + ///Gets the status of the test as an enum. + /// + /// + ///It returns one of these values:`Inconclusive`, `Skipped`, `Passed`, or `Failed` + /// + TestStatus TestStatus { get; } + /// + /// Gets the elapsed time for running the test in seconds + /// + /// + /// Time in seconds. + /// + double Duration { get; } + /// + /// Gets or sets the time the test started running. + /// + /// + ///A DataTime object. + /// + DateTime StartTime { get; } + /// + ///Gets or sets the time the test finished running. + /// + /// + ///A DataTime object. + /// + DateTime EndTime { get; } + + /// + /// The message associated with a test failure or with not running the test + /// + string Message { get; } + + /// + /// Any stacktrace associated with an error or failure. Not available in the Compact Framework 1.0. + /// + string StackTrace { get; } + + /// + /// The number of asserts executed when running the test and all its children. + /// + int AssertCount { get; } + + /// + /// The number of test cases that failed when running the test and all its children. + /// + int FailCount { get; } + + /// + /// The number of test cases that passed when running the test and all its children. + /// + int PassCount { get; } + + /// + /// The number of test cases that were skipped when running the test and all its children. + /// + int SkipCount { get; } + + /// + ///The number of test cases that were inconclusive when running the test and all its children. + /// + int InconclusiveCount { get; } + + /// + /// Accessing HasChildren should not force creation of the Children collection in classes implementing this interface. + /// + /// True if this result has any child results. + bool HasChildren { get; } + + /// + /// Gets the the collection of child results. + /// + IEnumerable Children { get; } + + /// + /// Gets any text output written to this result. + /// + string Output { get; } + /// + /// Use this to save the results to an XML file + /// + /// + /// The test results as an `NUnit` XML node. + /// + TNode ToXml(); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestResultAdaptor.cs.meta new file mode 100644 index 00000000..5ea944f1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestRunSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestRunSettings.cs new file mode 100644 index 00000000..0dab9313 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestRunSettings.cs @@ -0,0 +1,16 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// 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?view=netframework-4.8), and runs after building the Player with tests. + /// + public interface ITestRunSettings : IDisposable + { + /// + /// A method called before building the Player. + /// + void Apply(); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestRunSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestRunSettings.cs.meta new file mode 100644 index 00000000..27a3a332 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestRunnerApi.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestRunnerApi.cs new file mode 100644 index 00000000..da3ffddf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestRunnerApi.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestRunnerApi.cs.meta new file mode 100644 index 00000000..d581ffdb --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs new file mode 100644 index 00000000..cc5a3018 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/ITestTreeRebuildCallbacks.cs.meta new file mode 100644 index 00000000..eb1117cf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/RunState.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/RunState.cs new file mode 100644 index 00000000..e2df6612 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/RunState.cs @@ -0,0 +1,33 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// The RunState enum indicates whether a test can be executed. + /// + public enum RunState + { + /// + /// The test is not runnable. + /// + NotRunnable, + + /// + /// The test is runnable. + /// + Runnable, + + /// + /// The test can only be run explicitly + /// + Explicit, + + /// + /// The test has been skipped. This value may appear on a Test when certain attributes are used to skip the test. + /// + Skipped, + + /// + /// The test has been ignored. May appear on a Test, when the IgnoreAttribute is used. + /// + Ignored, + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/RunState.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/RunState.cs.meta new file mode 100644 index 00000000..818e3c02 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestAdaptor.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestAdaptor.cs new file mode 100644 index 00000000..556bb0c0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestAdaptor.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestAdaptor.cs.meta new file mode 100644 index 00000000..81e39b71 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs new file mode 100644 index 00000000..7a25ec84 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestAdaptorFactory.cs.meta new file mode 100644 index 00000000..0b1175fd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestMode.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestMode.cs new file mode 100644 index 00000000..e7a365e9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestMode.cs @@ -0,0 +1,20 @@ +using System; + +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// A flag indicating whether to run Edit Mode or Play Mode tests. + /// + [Flags] + public enum TestMode + { + /// + /// Run EditMode tests. + /// + EditMode = 1 << 0, + /// + /// Run PlayMode tests. + /// + PlayMode = 1 << 1 + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestMode.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestMode.cs.meta new file mode 100644 index 00000000..e04594b9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestResultAdaptor.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestResultAdaptor.cs new file mode 100644 index 00000000..7374b3fd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestResultAdaptor.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestResultAdaptor.cs.meta new file mode 100644 index 00000000..c2b119e2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestRunnerApi.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestRunnerApi.cs new file mode 100644 index 00000000..8757c8ca --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestRunnerApi.cs @@ -0,0 +1,158 @@ +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 +{ + /// + /// 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: + /// ``` + /// var testRunnerApi = ScriptableObject.CreateInstance<TestRunnerApi>(); + /// ``` + /// 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](https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/manual/extension-run-tests.html) + /// - [How to get test results](https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/manual/extension-get-test-results.html) + /// - [How to retrieve the list of tests](https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/manual/extension-retrieve-test-list.html) + /// + 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)); + }; + /// + /// Starts a test run with a given set of executionSettings. + /// + /// Set of + /// A GUID that identifies the TestJobData. + 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); + } + + /// + /// Sets up a given instance of to be invoked on test runs. + /// + /// + /// Generic representing a type of callback. + /// + /// + /// The test callbacks to be invoked. + /// + /// + /// Sets the order in which the callbacks are invoked, starting with the highest value first. + /// + public void RegisterCallbacks(T testCallbacks, int priority = 0) where T : ICallbacks + { + if (testCallbacks == null) + { + throw new ArgumentNullException(nameof(testCallbacks)); + } + + m_CallbacksHolder.Add(testCallbacks, priority); + } + /// + /// Unregister an instance of to no longer receive callbacks from test runs. + /// + /// + /// Generic representing a type of callback. + /// + /// The test callbacks to unregister. + 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); + } + /// + /// Retrieve the full test tree as ITestAdaptor for a given test mode. This is obsolete. Use TestRunnerApi.RetrieveTestTree instead. + /// + /// + /// + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestRunnerApi.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestRunnerApi.cs.meta new file mode 100644 index 00000000..7ad5fc15 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestStatus.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestStatus.cs new file mode 100644 index 00000000..d88c3dac --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestStatus.cs @@ -0,0 +1,28 @@ +namespace UnityEditor.TestTools.TestRunner.Api +{ + /// + /// The TestStatus enum indicates the test result status. + /// + public enum TestStatus + { + /// + /// The test ran with an inconclusive result. + /// + Inconclusive, + + /// + /// The test was skipped. + /// + Skipped, + + /// + /// The test ran and passed. + /// + Passed, + + /// + /// The test ran and failed. + /// + Failed + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestStatus.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/Api/TestStatus.cs.meta new file mode 100644 index 00000000..38bd6af0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/AssemblyInfo.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/AssemblyInfo.cs new file mode 100644 index 00000000..2dbc3c0a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/AssemblyInfo.cs @@ -0,0 +1,14 @@ +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.PackageManagerUI.Develop.Editor")] +[assembly: InternalsVisibleTo("Unity.PackageManagerUI.Develop.EditorTests")] +[assembly: InternalsVisibleTo("Unity.PackageValidationSuite.Editor")] + +[assembly: AssemblyVersion("1.0.0")] diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/AssemblyInfo.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/AssemblyInfo.cs.meta new file mode 100644 index 00000000..5e1b8dd1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser.meta new file mode 100644 index 00000000..b5a29bdc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7602252bdb82b8d45ae3483c3a00d3e1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs new file mode 100644 index 00000000..85823519 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/CommandLineOption.cs.meta new file mode 100644 index 00000000..65f32561 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs new file mode 100644 index 00000000..d08c233d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/CommandLineOptionSet.cs.meta new file mode 100644 index 00000000..1db24d0d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs new file mode 100644 index 00000000..7f699adc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineParser/ICommandLineOption.cs.meta new file mode 100644 index 00000000..613d95f0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest.meta new file mode 100644 index 00000000..d005718c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b477d1f29b65a674e9d5cdab4eb72b01 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/Executer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/Executer.cs new file mode 100644 index 00000000..fe0eb3b3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/Executer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/Executer.cs.meta new file mode 100644 index 00000000..e57a0103 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs new file mode 100644 index 00000000..3ff23563 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExecutionSettings.cs.meta new file mode 100644 index 00000000..35edc4c9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs new file mode 100644 index 00000000..30ea6d80 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs @@ -0,0 +1,52 @@ +using System; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + [Serializable] + internal class ExitCallbacks : ScriptableObject, IErrorCallbacks + { + internal static bool preventExit; + + public void RunFinished(ITestResultAdaptor testResults) + { + if (preventExit) + { + return; + } + + if (!ExitCallbacksDataHolder.instance.AnyTestsExecuted) + { + Debug.LogFormat(LogType.Warning, LogOption.NoStacktrace, null, "No tests were executed"); + } + + EditorApplication.Exit(ExitCallbacksDataHolder.instance.RunFailed ? (int)Executer.ReturnCodes.Failed : (int)Executer.ReturnCodes.Ok); + } + + public void TestStarted(ITestAdaptor test) + { + if (!test.IsSuite) + { + ExitCallbacksDataHolder.instance.AnyTestsExecuted = true; + } + } + + public void TestFinished(ITestResultAdaptor result) + { + if (!result.Test.IsSuite && (result.TestStatus == TestStatus.Failed || result.TestStatus == TestStatus.Inconclusive)) + { + ExitCallbacksDataHolder.instance.RunFailed = true; + } + } + + public void RunStarted(ITestAdaptor testsToRun) + { + } + + public void OnError(string message) + { + EditorApplication.Exit((int)Executer.ReturnCodes.RunError); + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacks.cs.meta new file mode 100644 index 00000000..62964631 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacksDataHolder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacksDataHolder.cs new file mode 100644 index 00000000..86cf5a88 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacksDataHolder.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.CommandLineTest +{ + internal class ExitCallbacksDataHolder : ScriptableSingleton + { + [SerializeField] + public bool AnyTestsExecuted; + [SerializeField] + public bool RunFailed; + } +} \ No newline at end of file diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacksDataHolder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacksDataHolder.cs.meta new file mode 100644 index 00000000..7b68ea55 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ExitCallbacksDataHolder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: aab045daa0ad4b01843dcf44013d9653 +timeCreated: 1605189497 \ No newline at end of file diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs new file mode 100644 index 00000000..557195d0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ISettingsBuilder.cs.meta new file mode 100644 index 00000000..cc0b2480 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs new file mode 100644 index 00000000..40a185f5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/LogSavingCallbacks.cs.meta new file mode 100644 index 00000000..c9681781 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs new file mode 100644 index 00000000..5470fd7e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/LogWriter.cs.meta new file mode 100644 index 00000000..56872b9f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs new file mode 100644 index 00000000..a3837bf9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ResultsSavingCallbacks.cs.meta new file mode 100644 index 00000000..ca06f3a3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs new file mode 100644 index 00000000..e713a6e9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/ResultsWriter.cs.meta new file mode 100644 index 00000000..074fe65c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/RunData.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/RunData.cs new file mode 100644 index 00000000..6a469a7b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/RunData.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/RunData.cs.meta new file mode 100644 index 00000000..4cfe30e6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs new file mode 100644 index 00000000..9b914c75 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/RunSettings.cs.meta new file mode 100644 index 00000000..0e241ba8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs new file mode 100644 index 00000000..16b66e40 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/SettingsBuilder.cs.meta new file mode 100644 index 00000000..1e2f8c93 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/SetupException.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/SetupException.cs new file mode 100644 index 00000000..33377134 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/SetupException.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/SetupException.cs.meta new file mode 100644 index 00000000..bdb235cf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs new file mode 100644 index 00000000..44130b28 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/CommandLineTest/TestStarter.cs.meta new file mode 100644 index 00000000..4d5dfdc0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI.meta new file mode 100644 index 00000000..bc9308a4 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e609b27ad2caa14c83dd9951b6c13c6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs new file mode 100644 index 00000000..0016142e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/AssetsDatabaseHelper.cs.meta new file mode 100644 index 00000000..4fad1fca --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/GuiHelper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/GuiHelper.cs new file mode 100644 index 00000000..81770fa5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/GuiHelper.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; +using Unity.CodeEditor; +using UnityEditor.Utils; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner.GUI +{ + internal class GuiHelper : IGuiHelper + { + public GuiHelper(IMonoCecilHelper monoCecilHelper, IAssetsDatabaseHelper assetsDatabaseHelper) + { + MonoCecilHelper = monoCecilHelper; + AssetsDatabaseHelper = assetsDatabaseHelper; + Editor = new DefaultExternalCodeEditor(); + GetCSFiles = (dirPath, fileExtension) => + { + return Directory.GetFiles(dirPath, $"*{fileExtension}", SearchOption.AllDirectories) + .Select(Paths.UnifyDirectorySeparator); + }; + } + internal Func> GetCSFiles; + protected IMonoCecilHelper MonoCecilHelper { get; private set; } + public IAssetsDatabaseHelper AssetsDatabaseHelper { get; private set; } + public IExternalCodeEditor Editor { get; internal set; } + private const string FileExtension = ".cs"; + + 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."); + } + + if (!fileOpenInfo.FilePath.Contains("Assets")) + { + Editor.OpenProject(fileOpenInfo.FilePath, fileOpenInfo.LineNumber, 1); + } + else + { + AssetsDatabaseHelper.OpenAssetInItsDefaultExternalEditor(fileOpenInfo.FilePath, fileOpenInfo.LineNumber); + } + + } + + public IFileOpenInfo GetFileOpenInfo(Type type, MethodInfo method) + { + var fileOpenInfo = MonoCecilHelper.TryGetCecilFileOpenInfo(type, method); + if (string.IsNullOrEmpty(fileOpenInfo.FilePath)) + { + var dirPath = Paths.UnifyDirectorySeparator(Application.dataPath); + var allCsFiles = GetCSFiles(dirPath, FileExtension); + + var fileName = allCsFiles.FirstOrDefault(x => + x.Split(Path.DirectorySeparatorChar).Last().Equals(string.Concat(GetTestFileName(type), FileExtension))); + + fileOpenInfo.FilePath = fileName ?? string.Empty; + } + + if (!fileOpenInfo.FilePath.Contains("Assets")) + { + return fileOpenInfo; + } + fileOpenInfo.FilePath = FilePathToAssetsRelativeAndUnified(fileOpenInfo.FilePath); + + return fileOpenInfo; + } + + internal static string GetTestFileName(Type type) + { + //This handles the case of a test in a nested class, getting the name of the base class + if (type.FullName != null && type.Namespace!=null && type.FullName.Contains("+")) + { + var removedNamespace = type.FullName.Substring(type.Namespace.Length+1); + return removedNamespace.Substring(0,removedNamespace.IndexOf("+", StringComparison.Ordinal)); + } + return type.Name; + } + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/GuiHelper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/GuiHelper.cs.meta new file mode 100644 index 00000000..a1512d06 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs new file mode 100644 index 00000000..3e26c53a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/IAssetsDatabaseHelper.cs.meta new file mode 100644 index 00000000..622fe68d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/IGuiHelper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/IGuiHelper.cs new file mode 100644 index 00000000..a87fb8df --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/IGuiHelper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/IGuiHelper.cs.meta new file mode 100644 index 00000000..9c6e266b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder.meta new file mode 100644 index 00000000..e6829237 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 07ea0326ed848fb4489187cb58f96113 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs new file mode 100644 index 00000000..34118d65 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/RenderingOptions.cs.meta new file mode 100644 index 00000000..57e67487 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs new file mode 100644 index 00000000..7d7b7ff9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/ResultSummarizer.cs.meta new file mode 100644 index 00000000..bc4b465e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs new file mode 100644 index 00000000..10f96bf5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/TestFilterSettings.cs.meta new file mode 100644 index 00000000..af8b799a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs new file mode 100644 index 00000000..63965afb --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListBuilder/TestTreeViewBuilder.cs.meta new file mode 100644 index 00000000..68a6c250 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs new file mode 100644 index 00000000..05cadbac --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListGuiHelper.cs.meta new file mode 100644 index 00000000..70d8f193 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView.meta new file mode 100644 index 00000000..63ce2ad0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 68cb547af0187634aad591a09c01cd5b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs new file mode 100644 index 00000000..52c94a51 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/Icons.cs.meta new file mode 100644 index 00000000..3ddb7ee1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs new file mode 100644 index 00000000..454af2aa --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewDataSource.cs.meta new file mode 100644 index 00000000..5ec53327 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs new file mode 100644 index 00000000..66578130 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestListTreeViewGUI.cs.meta new file mode 100644 index 00000000..ed09e250 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs new file mode 100644 index 00000000..3c3f6492 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestListTreeView/TestTreeViewItem.cs.meta new file mode 100644 index 00000000..1a29abe9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestRunnerResult.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestRunnerResult.cs new file mode 100644 index 00000000..717cf37f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestRunnerResult.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestRunnerResult.cs.meta new file mode 100644 index 00000000..771053c1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs new file mode 100644 index 00000000..c55c2b3b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/TestRunnerUIFilter.cs.meta new file mode 100644 index 00000000..e65f91a3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs new file mode 100644 index 00000000..a557dee4 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/UITestRunnerFilter.cs.meta new file mode 100644 index 00000000..26ef62ea --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views.meta new file mode 100644 index 00000000..ca14182c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c5535d742ea2e4941850b421f9c70a1f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs new file mode 100644 index 00000000..1a7d9061 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/EditModeTestListGUI.cs.meta new file mode 100644 index 00000000..afd4abb5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs new file mode 100644 index 00000000..4f82f470 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/PlayModeTestListGUI.cs.meta new file mode 100644 index 00000000..6f0c1d6d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs new file mode 100644 index 00000000..ae633bac --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/GUI/Views/TestListGUIBase.cs.meta new file mode 100644 index 00000000..3bef151c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension.meta new file mode 100644 index 00000000..0c998895 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f9202a39620f51418046c7754f215f0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes.meta new file mode 100644 index 00000000..a5930f1a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 96c503bf059df984c86eecf572370347 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs new file mode 100644 index 00000000..e71b62c9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/AssetPipelineIgnore.cs.meta new file mode 100644 index 00000000..5f7207f1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs new file mode 100644 index 00000000..dcc5dae6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs @@ -0,0 +1,15 @@ +namespace UnityEditor.TestTools +{ + /// + /// An interface for a callback modifying the when building a player for running tests in the runtime. + /// + public interface ITestPlayerBuildModifier + { + /// + /// A callback to modify the when building a player for test run. Return the modified version of the provided build options. + /// + /// The unmodified BuildPlayerOptions. + /// The modified BuildPlayerOptions. + BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions); + } +} \ No newline at end of file diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/ITestPlayerBuildModifier.cs.meta new file mode 100644 index 00000000..1bb36a65 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs new file mode 100644 index 00000000..328e6664 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/Attributes/TestPlayerBuildModifierAttribute.cs.meta new file mode 100644 index 00000000..3f9dfe35 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs new file mode 100644 index 00000000..a24190e4 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/NUnitExtension/TestRunnerStateSerializer.cs.meta new file mode 100644 index 00000000..7d36e9d1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/RequireApiProfileAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/RequireApiProfileAttribute.cs new file mode 100644 index 00000000..e99d4524 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/RequireApiProfileAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/RequireApiProfileAttribute.cs.meta new file mode 100644 index 00000000..66d03bd4 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs new file mode 100644 index 00000000..321a0fe0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/RequirePlatformSupportAttribute.cs.meta new file mode 100644 index 00000000..84930580 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs new file mode 100644 index 00000000..a0947cbd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestBuildAssemblyFilter.cs.meta new file mode 100644 index 00000000..f3cd3bd2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers.meta new file mode 100644 index 00000000..c6a951b3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d64d92e4f04a13e4b99ea8d48e9e8ae9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs new file mode 100644 index 00000000..236d6a89 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/AttributeFinderBase.cs.meta new file mode 100644 index 00000000..19986f0e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs new file mode 100644 index 00000000..b331d155 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/DelayedCallback.cs.meta new file mode 100644 index 00000000..5218c8ec --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs new file mode 100644 index 00000000..12683dcf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/EditModeLauncher.cs.meta new file mode 100644 index 00000000..694d7d6a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs new file mode 100644 index 00000000..e20305cd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/EditModeLauncherContextSettings.cs.meta new file mode 100644 index 00000000..2bed8fde --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta new file mode 100644 index 00000000..49473826 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ebc4d20cc106cea49b1df1153f0b3b5e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs new file mode 100644 index 00000000..e0f72777 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/AndroidPlatformSetup.cs.meta new file mode 100644 index 00000000..6e18a7c7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs new file mode 100644 index 00000000..f625eb23 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/ApplePlatformSetup.cs.meta new file mode 100644 index 00000000..36f22a6b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs new file mode 100644 index 00000000..db76c212 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/IPlatformSetup.cs.meta new file mode 100644 index 00000000..94405b53 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs new file mode 100644 index 00000000..1a0c4bf4 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/LuminPlatformSetup.cs.meta new file mode 100644 index 00000000..9e4dcc52 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs new file mode 100644 index 00000000..4c8ae77c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/PlatformSpecificSetup.cs.meta new file mode 100644 index 00000000..a250a1a3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs new file mode 100644 index 00000000..c62016be --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/StadiaPlatformSetup.cs.meta new file mode 100644 index 00000000..59e70a4c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs new file mode 100644 index 00000000..7c1ea363 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/SwitchPlatformSetup.cs.meta new file mode 100644 index 00000000..fb9dd054 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs new file mode 100644 index 00000000..a229c343 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/UwpPlatformSetup.cs.meta new file mode 100644 index 00000000..751ac7e9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs new file mode 100644 index 00000000..54c51edb --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlatformSetup/XboxOnePlatformSetup.cs.meta new file mode 100644 index 00000000..771c8538 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs new file mode 100644 index 00000000..ea3e5968 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs @@ -0,0 +1,251 @@ +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) + { + editorConnectionTestCollector.CleanUp(); + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncher.cs.meta new file mode 100644 index 00000000..60bb1c7f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs new file mode 100644 index 00000000..b4985147 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherBuildOptions.cs.meta new file mode 100644 index 00000000..73c17796 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs new file mode 100644 index 00000000..151d8a28 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherContextSettings.cs.meta new file mode 100644 index 00000000..29cb8915 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs new file mode 100644 index 00000000..21832827 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlayerLauncherTestRunSettings.cs.meta new file mode 100644 index 00000000..ea71a0cf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs new file mode 100644 index 00000000..223db274 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PlaymodeLauncher.cs.meta new file mode 100644 index 00000000..ddb6e1c3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs new file mode 100644 index 00000000..32dee2b6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PostbuildCleanupAttributeFinder.cs.meta new file mode 100644 index 00000000..454dd107 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs new file mode 100644 index 00000000..b51241f5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/PrebuildSetupAttributeFinder.cs.meta new file mode 100644 index 00000000..d524e56e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs new file mode 100644 index 00000000..abaa2192 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemotePlayerLogController.cs.meta new file mode 100644 index 00000000..b2084192 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs new file mode 100644 index 00000000..fc21332c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs @@ -0,0 +1,115 @@ +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(); + } + + public void CleanUp() + { + m_PlatformSpecificSetup.CleanUp(); + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemotePlayerTestController.cs.meta new file mode 100644 index 00000000..020222b5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs new file mode 100644 index 00000000..75b07125 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RemoteTestResultReciever.cs.meta new file mode 100644 index 00000000..e7010151 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs new file mode 100644 index 00000000..87d96728 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/RuntimeTestLauncherBase.cs.meta new file mode 100644 index 00000000..28c74163 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs new file mode 100644 index 00000000..7bfd3546 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestLaunchers/TestLauncherBase.cs.meta new file mode 100644 index 00000000..c36990c7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestResultSerializer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestResultSerializer.cs new file mode 100644 index 00000000..b95f63ac --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestResultSerializer.cs @@ -0,0 +1,80 @@ +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 double endTimeAO; + + [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.endTimeAO = result.EndTime.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)); + var baseType = result.GetType().BaseType; + baseType.GetField("_resultState", flags).SetValue(result, resultState); + baseType.GetField("_output", flags).SetValue(result, new StringBuilder(output)); + baseType.GetField("_duration", flags).SetValue(result, duration); + baseType.GetField("_message", flags).SetValue(result, message); + baseType.GetField("_stackTrace", flags).SetValue(result, stacktrace); + baseType.GetProperty("StartTime", flags) + .SetValue(result, DateTime.FromOADate(startTimeAO), null); + baseType.GetProperty("EndTime", flags) + .SetValue(result, DateTime.FromOADate(endTimeAO), null); + } + + public bool IsPassed() + { + return status == TestStatus.Passed.ToString(); + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestResultSerializer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestResultSerializer.cs.meta new file mode 100644 index 00000000..96f29603 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun.meta new file mode 100644 index 00000000..6f6e8cfd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8721cb2237d4a564a94a51f56243bdac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks.meta new file mode 100644 index 00000000..bb019b79 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6dba53789da15814387fa5b1445e81e0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs new file mode 100644 index 00000000..7efaecb2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/BuildActionTaskBase.cs.meta new file mode 100644 index 00000000..54afd57c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs new file mode 100644 index 00000000..b66f5073 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/BuildTestTreeTask.cs.meta new file mode 100644 index 00000000..b00d7b1d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs new file mode 100644 index 00000000..cf07f4c3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/CleanupVerificationTask.cs.meta new file mode 100644 index 00000000..2ea7cb03 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs new file mode 100644 index 00000000..35f4aa0a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/FileCleanupVerifierTaskBase.cs.meta new file mode 100644 index 00000000..617b92d8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs new file mode 100644 index 00000000..30db2674 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyEditModeRunTask.cs.meta new file mode 100644 index 00000000..3a65c889 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs new file mode 100644 index 00000000..b0b30df3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayModeRunTask.cs.meta new file mode 100644 index 00000000..0a753683 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs new file mode 100644 index 00000000..3f241350 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/LegacyPlayerRunTask.cs.meta new file mode 100644 index 00000000..67eea1a1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs new file mode 100644 index 00000000..93878cf7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/PerformUndoTask.cs.meta new file mode 100644 index 00000000..f5067424 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs new file mode 100644 index 00000000..adec2ae2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/PrebuildSetupTask.cs.meta new file mode 100644 index 00000000..5a564af7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs new file mode 100644 index 00000000..50b4cf67 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/RegisterFilesForCleanupVerificationTask.cs.meta new file mode 100644 index 00000000..51eb7dd8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs new file mode 100644 index 00000000..d42f7b96 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/SaveModiedSceneTask.cs.meta new file mode 100644 index 00000000..7300f3bd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs new file mode 100644 index 00000000..ee6de8f7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/SaveUndoIndexTask.cs.meta new file mode 100644 index 00000000..30789a18 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs new file mode 100644 index 00000000..81b18491 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/Tasks/TestTaskBase.cs.meta new file mode 100644 index 00000000..8b54c2e1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobData.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobData.cs new file mode 100644 index 00000000..05ab5034 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobData.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobData.cs.meta new file mode 100644 index 00000000..5da5662e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs new file mode 100644 index 00000000..7852f739 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobDataHolder.cs.meta new file mode 100644 index 00000000..3612b80a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobRunner.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobRunner.cs new file mode 100644 index 00000000..8a9cd4f9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobRunner.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestJobRunner.cs.meta new file mode 100644 index 00000000..df11aa02 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs new file mode 100644 index 00000000..542c501f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRun/TestRunCanceledException.cs.meta new file mode 100644 index 00000000..2237e642 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner.meta new file mode 100644 index 00000000..d09886b6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 49d4c2ab7ff0f4442af256bad7c9d57c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks.meta new file mode 100644 index 00000000..9e611a48 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d7f0d6acfced954682a89e7002c04d9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs new file mode 100644 index 00000000..a22c7988 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/EditModeRunnerCallback.cs.meta new file mode 100644 index 00000000..1a0d71c8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs new file mode 100644 index 00000000..a4976af2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallback.cs.meta new file mode 100644 index 00000000..6dae8f25 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs new file mode 100644 index 00000000..d6abd3fc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackData.cs.meta new file mode 100644 index 00000000..8615d9b0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs new file mode 100644 index 00000000..2260d4da --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/RerunCallbackInitializer.cs.meta new file mode 100644 index 00000000..778b8fca --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs new file mode 100644 index 00000000..4234754a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/TestRunnerCallback.cs.meta new file mode 100644 index 00000000..1356ff98 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs new file mode 100644 index 00000000..05465d85 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdater.cs.meta new file mode 100644 index 00000000..d9e35df8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs new file mode 100644 index 00000000..a1fd48d3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Callbacks/WindowResultUpdaterDataHolder.cs.meta new file mode 100644 index 00000000..aed0d8c0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs new file mode 100644 index 00000000..8776887c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditModePCHelper.cs.meta new file mode 100644 index 00000000..ce559af2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs new file mode 100644 index 00000000..91481825 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs @@ -0,0 +1,447 @@ +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] + private EnumerableTestState m_EnumerableTestState; + + [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_EnumerableTestState == null) + { + m_EnumerableTestState = CreateInstance(); + } + context.EnumerableTestState = m_EnumerableTestState; + + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditModeRunner.cs.meta new file mode 100644 index 00000000..78c00399 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs new file mode 100644 index 00000000..c2bf9212 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditmodeWorkItemFactory.cs.meta new file mode 100644 index 00000000..ab4bd459 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs new file mode 100644 index 00000000..acf09dde --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EditorEnumeratorTestWorkItem.cs.meta new file mode 100644 index 00000000..982f7eeb --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs new file mode 100644 index 00000000..46fc7145 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/EnumeratorStepHelper.cs.meta new file mode 100644 index 00000000..08662b9e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages.meta new file mode 100644 index 00000000..0660c637 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d9682e749d3efc642af54d789d9090a6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs new file mode 100644 index 00000000..4c7c9fa7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + /// + /// Implements . Creates a yield instruction to enter Play Mode. + /// + public class EnterPlayMode : IEditModeTestYieldInstruction + { + /// + /// Returns true if the instruction expects a domain reload to occur. + /// + public bool ExpectDomainReload { get; } + /// + /// Returns true if the instruction expects the Unity Editor to be in **Play Mode**. + /// + public bool ExpectedPlaymodeState { get; private set; } + /// + /// 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. + /// + /// A flag indication whether to expect a domain reload. + public EnterPlayMode(bool expectDomainReload = true) + { + ExpectDomainReload = expectDomainReload; + } + + /// + /// Performs the multi-step instructions of entering PlayMode. + /// + /// An IEnumerator with the async steps. + /// An exception is thrown if the editor is already in PlayMode or if script compilation failed. + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/EnterPlayMode.cs.meta new file mode 100644 index 00000000..fa1dc2e0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs new file mode 100644 index 00000000..b4d072de --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + /// + /// Implements . A new instance of the class is a yield instruction to exit Play Mode. + /// + public class ExitPlayMode : IEditModeTestYieldInstruction + { + /// + /// Gets the value of ExpectDomainReload + /// + public bool ExpectDomainReload { get; } + /// + /// Gets the value of ExpectedPlaymodeState + /// + public bool ExpectedPlaymodeState { get; private set; } + /// + /// Sets ExpectDomainReload and ExpectedPlaymodeState to false. + /// + public ExitPlayMode() + { + ExpectDomainReload = false; + ExpectedPlaymodeState = false; + } + + /// + /// Performs the multi-step instruction of exiting PlayMode. + /// + /// An IEnumerator with the async steps. + /// An exception is thrown if the editor is not in PlayMode. + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/ExitPlayMode.cs.meta new file mode 100644 index 00000000..1de769dc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs new file mode 100644 index 00000000..2433d0d9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections; +using UnityEditor; + +namespace UnityEngine.TestTools +{ + /// + /// `RecompileScripts` is an that you can yield in Edit Mode tests. It lets you trigger a recompilation of scripts in the Unity Editor. + /// + public class RecompileScripts : IEditModeTestYieldInstruction + { + /// + /// Creates a new instance of the `RecompileScripts` yield instruction. + /// + /// + /// [UnitySetUp] + /// public IEnumerator SetUp() + /// { + /// using (var file = File.CreateText("Assets/temp/myScript.cs")) + /// { + /// file.Write("public class ATempClass { }"); + /// } + /// AssetDatabase.Refresh(); + /// yield return new RecompileScripts(); + /// } + /// + /// + /// + public RecompileScripts() : this(true) + { + } + /// + /// Creates a new instance of the `RecompileScripts` yield instruction. + /// + /// This parameter 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. + public RecompileScripts(bool expectScriptCompilation) : this(expectScriptCompilation, true) + { + } + /// + /// Creates a new instance of the `RecompileScripts` yield instruction. + /// + /// This parameter 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. + /// This parameter indicates if you expect a script compilation to succeed. If not succeeded then an exception will be thrown. + public RecompileScripts(bool expectScriptCompilation, bool expectScriptCompilationSuccess) + { + ExpectScriptCompilation = expectScriptCompilation; + ExpectScriptCompilationSuccess = expectScriptCompilationSuccess; + ExpectDomainReload = true; + } + + /// + /// Returns true if the instruction expects a domain reload to occur. + /// + public bool ExpectDomainReload { get; private set; } + /// + /// Returns true if the instruction expects the Unity Editor to be in **Play Mode**. + /// + public bool ExpectedPlaymodeState { get; } + /// + /// Indicates whether a script compilation is expected. + /// + public bool ExpectScriptCompilation { get; private set; } + /// + /// Indicates whether the expected script compilation is expected to succeed. + /// + public bool ExpectScriptCompilationSuccess { get; private set; } + + /// + /// The current active instance of the RecompileScripts yield instruction. + /// + public static RecompileScripts Current { get; private set; } + + /// + /// Perform the multi step instruction of triggering a recompilation of scripts and waiting for its completion. + /// + /// An IEnumerator with the async steps. + /// Throws an exception if the editor does not need to recompile scripts or if the script compilation failed when expected to succeed. + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/RecompileScripts.cs.meta new file mode 100644 index 00000000..f764d6e8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs new file mode 100644 index 00000000..38cb5747 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections; +using UnityEditor; +using UnityEditorInternal; + +namespace UnityEngine.TestTools +{ + /// + /// WaitForDomainReload is an 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. + /// + public class WaitForDomainReload : IEditModeTestYieldInstruction + { + /// + /// Create a new instance of the `WaitForDomainReload` yield instruction. + /// + /// + /// [UnitySetUp] + /// public IEnumerator SetUp() + /// { + /// File.Copy("Resources/MyDll.dll", @"Assets/MyDll.dll", true); // Trigger a domain reload. + /// AssetDatabase.Refresh(); + /// yield return new WaitForDomainReload(); + /// } + /// + /// + /// + public WaitForDomainReload() + { + ExpectDomainReload = true; + } + + /// + /// Returns true if the instruction expects a domain reload to occur. + /// + public bool ExpectDomainReload { get;  } + /// + /// Returns true if the instruction expects the Unity Editor to be in **Play Mode**. + /// + public bool ExpectedPlaymodeState { get; } + + /// + /// Perform the multi step action of waiting for a domain reload. + /// + /// An IEnumerator with steps. + /// Throws an exception if script compilation failed or if the expected domain reload did not occur. + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Messages/WaitForDomainReload.cs.meta new file mode 100644 index 00000000..7fa45cb5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils.meta new file mode 100644 index 00000000..78ceec0c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f5bbb88ca730434483440cbc0278ef6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs new file mode 100644 index 00000000..ff540e67 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/CachingTestListProvider.cs.meta new file mode 100644 index 00000000..57566236 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs new file mode 100644 index 00000000..bc0fe193 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorAssembliesProxy.cs.meta new file mode 100644 index 00000000..fdb1b6c4 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs new file mode 100644 index 00000000..804eb4b1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorAssemblyWrapper.cs.meta new file mode 100644 index 00000000..70bd58bf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs new file mode 100644 index 00000000..ad0b5ad5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorCompilationInterfaceProxy.cs.meta new file mode 100644 index 00000000..ef5ade0a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs new file mode 100644 index 00000000..363c06f9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs @@ -0,0 +1,120 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +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() } + }; + var filteredAssemblies = FilterAssembliesWithTestReference(loadedAssemblies); + + foreach (var loadedAssembly in filteredAssemblies) + { + 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; + } + + private IAssemblyWrapper[] FilterAssembliesWithTestReference(IAssemblyWrapper[] loadedAssemblies) + { + var filteredResults = new Dictionary(); + foreach (var assembly in loadedAssemblies) + { + FilterAssemblyForTestReference(assembly, loadedAssemblies, filteredResults); + } + + return filteredResults.Where(pair => pair.Value).Select(pair => pair.Key).ToArray(); + } + + private void FilterAssemblyForTestReference(IAssemblyWrapper assemblyToFilter, IAssemblyWrapper[] loadedAssemblies, IDictionary filterResults) + { + if (filterResults.ContainsKey(assemblyToFilter)) + { + return; + } + + var references = assemblyToFilter.GetReferencedAssemblies(); + if (references.Any(IsTestReference)) + { + filterResults[assemblyToFilter] = true; + return; + } + + foreach (var reference in references) + { + var referencedAssembly = loadedAssemblies.FirstOrDefault(a => a.Name.Name == reference.Name); + if (referencedAssembly == null) + { + continue; + } + + FilterAssemblyForTestReference(referencedAssembly, loadedAssemblies, filterResults); + + if (filterResults[referencedAssembly]) + { + filterResults[assemblyToFilter] = true; + return; + } + } + + filterResults[assemblyToFilter] = false; + } + + private static bool IsTestReference(AssemblyName assemblyName) + { + return assemblyName.Name == k_NunitAssemblyName || + assemblyName.Name == k_TestRunnerAssemblyName || + assemblyName.Name == k_PerformanceTestingAssemblyName; + } + } +} \ No newline at end of file diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/EditorLoadedTestAssemblyProvider.cs.meta new file mode 100644 index 00000000..efba6a7c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs new file mode 100644 index 00000000..35ec87d0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorAssembliesProxy.cs.meta new file mode 100644 index 00000000..ad00f55d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs new file mode 100644 index 00000000..25defb78 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorCompilationInterfaceProxy.cs.meta new file mode 100644 index 00000000..2bc608bf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs new file mode 100644 index 00000000..d54bda79 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/IEditorLoadedTestAssemblyProvider.cs.meta new file mode 100644 index 00000000..cbe48975 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs new file mode 100644 index 00000000..5df7a784 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListCache.cs.meta new file mode 100644 index 00000000..41943d42 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs new file mode 100644 index 00000000..d11fe475 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListCacheData.cs.meta new file mode 100644 index 00000000..b229c0cb --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs new file mode 100644 index 00000000..b734f536 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/ITestListProvider.cs.meta new file mode 100644 index 00000000..b62929bc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs new file mode 100644 index 00000000..e69bfcbc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListCache.cs.meta new file mode 100644 index 00000000..ea8d0966 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs new file mode 100644 index 00000000..175082f1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListCacheData.cs.meta new file mode 100644 index 00000000..2ad79aca --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs new file mode 100644 index 00000000..0df60c35 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListJob.cs.meta new file mode 100644 index 00000000..a17c0915 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs new file mode 100644 index 00000000..1da846e9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunner/Utils/TestListProvider.cs.meta new file mode 100644 index 00000000..c0e66d53 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunnerWindow.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunnerWindow.cs new file mode 100644 index 00000000..0be1bcea --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunnerWindow.cs @@ -0,0 +1,266 @@ +using System; +using UnityEditor.Callbacks; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEditor.TestTools.TestRunner.GUI; +using UnityEngine; + +namespace UnityEditor.TestTools.TestRunner +{ + /// + /// The TestRunnerWindow class is repsonsible for drawing the Test Runner window. + /// + [Serializable] + 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_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; + + /// + /// Launches the Test Runner window. + /// + [MenuItem("Window/General/Test Runner", false, 201, false)] + public static void ShowWindow() + { + s_Instance = GetWindow("Test Runner"); + s_Instance.Show(); + } + + 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); + + if (EditorPrefs.GetBool("InternalMode", false)) + { + menu.AddItem(m_GUIRunPlayModeTestAsEditModeTests, PlayerSettings.runPlayModeTestAsEditModeTest, () => + { + PlayerSettings.runPlayModeTestAsEditModeTest = !PlayerSettings.runPlayModeTestAsEditModeTest; + }); + } + + if (PlayerSettings.playModeTestRunnerEnabled) + { + PlayerSettings.playModeTestRunnerEnabled = false; + EditorUtility.DisplayDialog(m_GUIDisablePlaymodeTestsRunner.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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunnerWindow.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunnerWindow.cs.meta new file mode 100644 index 00000000..5cb0e868 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunnerWindowSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunnerWindowSettings.cs new file mode 100644 index 00000000..366df260 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunnerWindowSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestRunnerWindowSettings.cs.meta new file mode 100644 index 00000000..44bcc5a0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings.meta new file mode 100644 index 00000000..41276310 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95b719082a664ea45bb56759eed1f271 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/ITestSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/ITestSettings.cs new file mode 100644 index 00000000..d2720372 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/ITestSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/ITestSettings.cs.meta new file mode 100644 index 00000000..9a8563c9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs new file mode 100644 index 00000000..701c91d8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner +{ + interface ITestSettingsDeserializer + { + ITestSettings GetSettingsFromJsonFile(string jsonFilePath); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/ITestSettingsDeserializer.cs.meta new file mode 100644 index 00000000..72c587e7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/TestSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/TestSettings.cs new file mode 100644 index 00000000..a5bdf7ad --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/TestSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/TestSettings.cs.meta new file mode 100644 index 00000000..23e6f5e2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs new file mode 100644 index 00000000..cdba06e9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/TestSettings/TestSettingsDeserializer.cs.meta new file mode 100644 index 00000000..4d50295d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef new file mode 100644 index 00000000..efdc7cf6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta new file mode 100644 index 00000000..63c02900 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityEditor.TestRunner.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0acc523941302664db1f4e527237feb3 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol.meta new file mode 100644 index 00000000..8499c835 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 936c6340f3468444ebb1785b4c311126 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs new file mode 100644 index 00000000..f7dcacfe --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/ITestRunnerApiMapper.cs.meta new file mode 100644 index 00000000..75e0ba23 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs new file mode 100644 index 00000000..bdb96c13 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs @@ -0,0 +1,7 @@ +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + interface IUtpLogger + { + void Log(Message msg); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpLogger.cs.meta new file mode 100644 index 00000000..dbd33aac --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs new file mode 100644 index 00000000..c2ddc3d1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using UnityEditor.Compilation; +using UnityEditor.TestTools.TestRunner.Api; + +namespace UnityEditor.TestTools.TestRunner.UnityTestProtocol +{ + internal interface IUtpMessageReporter + { + void ReportTestFinished(ITestResultAdaptor result); + void ReportTestRunStarted(ITestAdaptor testsToRun); + void ReportTestStarted(ITestAdaptor test); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/IUtpMessageReporter.cs.meta new file mode 100644 index 00000000..4c96a902 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/Message.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/Message.cs new file mode 100644 index 00000000..d10a5e42 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/Message.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/Message.cs.meta new file mode 100644 index 00000000..bfc702bb --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs new file mode 100644 index 00000000..66e18ff8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestFinishedMessage.cs.meta new file mode 100644 index 00000000..15b951b9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs new file mode 100644 index 00000000..c0a76dad --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestPlanMessage.cs.meta new file mode 100644 index 00000000..c057f60c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs new file mode 100644 index 00000000..356ff8be --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs @@ -0,0 +1,93 @@ +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; + } + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestRunnerApiMapper.cs.meta new file mode 100644 index 00000000..47634b98 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs new file mode 100644 index 00000000..c21464fc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestStartedMessage.cs.meta new file mode 100644 index 00000000..18b53d11 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs new file mode 100644 index 00000000..223a73d5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/TestState.cs.meta new file mode 100644 index 00000000..ac666417 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs new file mode 100644 index 00000000..09daf8dc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolListener.cs.meta new file mode 100644 index 00000000..8ba29bea --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs new file mode 100644 index 00000000..fda5b620 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs @@ -0,0 +1,24 @@ +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); + } + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UnityTestProtocolStarter.cs.meta new file mode 100644 index 00000000..540b31e0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs new file mode 100644 index 00000000..e32f6d28 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UtpDebuglogger.cs.meta new file mode 100644 index 00000000..7debc237 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs new file mode 100644 index 00000000..a9d6a344 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs @@ -0,0 +1,46 @@ +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 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEditor.TestRunner/UnityTestProtocol/UtpMessageReporter.cs.meta new file mode 100644 index 00000000..c818d4ff --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner.meta new file mode 100644 index 00000000..95890508 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 950890083f4907541a6ed06d70959e49 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/AssemblyInfo.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/AssemblyInfo.cs new file mode 100644 index 00000000..41496773 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/AssemblyInfo.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/AssemblyInfo.cs.meta new file mode 100644 index 00000000..b499e312 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions.meta new file mode 100644 index 00000000..4e7bbdfe --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ad55f5ad04d1d045a1f287409c650dd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs new file mode 100644 index 00000000..9ab80262 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs @@ -0,0 +1,128 @@ +using System; +using NUnit.Framework; +using NUnit.Framework.Constraints; +using UnityEngine.Profiling; + +namespace UnityEngine.TestTools.Constraints +{ + /// + /// An NUnit test constraint class to test whether a given block of code makes any GC allocations. + /// + /// Use this class with NUnit's Assert.That() method to make assertions about the GC behaviour of your code. The constraint executes the delegate you provide, and checks if it has caused any GC memory to be allocated. If any GC memory was allocated, the constraint passes; otherwise, the constraint fails. + /// + /// Usually you negate this constraint to make sure that your delegate does not allocate any GC memory. This is easy to do using the Is class: + /// + /// + /// + /// using NUnit.Framework; + /// using UnityEngine.TestTools.Constraints; + /// using Is = UnityEngine.TestTools.Constraints.Is; + /// + /// public class MyTestClass + /// { + /// [Test] + /// public void SettingAVariableDoesNotAllocate() + /// { + /// Assert.That(() => { + /// int a = 0; + /// a = 1; + /// }, Is.Not.AllocatingGCMemory()); + /// } + /// } + /// + /// + 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); + } + + /// + /// Applies GC memory constraint to the test. + /// + /// An object to apply the GC constraint to. Should be a . + /// A ConstraintResult + /// Throws a if the provided object is null. + /// Throws a if the provided object is not a . + 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); + } + + /// + /// Test whether the constraint is satisfied by a given reference. + /// The default implementation simply dereferences the value but + /// derived classes may override it to provide for delayed processing. + /// + /// The type of the actual value delegate to be tested. + /// A reference to the value delegate to be tested + /// A ConstraintResult + /// Throws a if the provided delegate is null. + public override ConstraintResult ApplyTo(ActualValueDelegate del) + { + if (del == null) + throw new ArgumentNullException(); + + return ApplyTo(() => del.Invoke(), del); + } + + /// + /// The Description of what this constraint tests, for to use in messages and in the ConstraintResult. + /// + public override string Description + { + get { return "allocates GC memory"; } + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/AllocatingGCMemoryConstraint.cs.meta new file mode 100644 index 00000000..0933c855 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs new file mode 100644 index 00000000..812b1f06 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/ConstraintsExtensions.cs.meta new file mode 100644 index 00000000..13434964 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs new file mode 100644 index 00000000..ab4ff8e3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/InvalidSignatureException.cs.meta new file mode 100644 index 00000000..86aee7fa --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/Is.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/Is.cs new file mode 100644 index 00000000..c0871ef2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/Is.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/Is.cs.meta new file mode 100644 index 00000000..23ed44a6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogAssert.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogAssert.cs new file mode 100644 index 00000000..350bd692 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogAssert.cs @@ -0,0 +1,78 @@ +using System.Text.RegularExpressions; +using UnityEngine.TestTools.Logging; + +namespace UnityEngine.TestTools +{ + /// + /// A test fails if Unity logs a message other than a regular log or warning message. Use `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. + /// + /// `LogAssert` lets you expect Unity log messages that would otherwise cause the test to fail. + /// + public static class LogAssert + { + /// + /// 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. + /// + /// A type of log to expect. It can take one of the [LogType enum](https://docs.unity3d.com/ScriptReference/LogType.html) values. + /// A string value that should equate to the expected message. + /// + /// + /// [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"); + /// } + /// + /// + /// + public static void Expect(LogType type, string message) + { + LogScope.Current.ExpectedLogs.Enqueue(new LogMatch() { LogType = type, Message = 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. + /// + /// A type of log to expect. It can take one of the [LogType enum](https://docs.unity3d.com/ScriptReference/LogType.html) values. + /// A regular expression pattern to match the expected message. + public static void Expect(LogType type, Regex message) + { + LogScope.Current.ExpectedLogs.Enqueue(new LogMatch() { LogType = type, MessageRegex = message }); + } + /// + /// 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 attribute instead. + /// + public static void NoUnexpectedReceived() + { + LogScope.Current.NoUnexpectedReceived(); + } + /// Set this property to `true` to prevent unexpected error log messages from triggering an assertion. By default, it is `false`. + /// The value of the ignoreFailingMessages boolean property. + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogAssert.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogAssert.cs.meta new file mode 100644 index 00000000..7a278a31 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope.meta new file mode 100644 index 00000000..284dc6ad --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b1d8465ba1376b148bdab58965101f47 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs new file mode 100644 index 00000000..5e73bb54 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/ILogScope.cs.meta new file mode 100644 index 00000000..69e7d556 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs new file mode 100644 index 00000000..bbc805e8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogEvent.cs.meta new file mode 100644 index 00000000..66c9130d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs new file mode 100644 index 00000000..9b862d92 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogMatch.cs.meta new file mode 100644 index 00000000..ffc2bc32 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs new file mode 100644 index 00000000..84957d87 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/LogScope/LogScope.cs.meta new file mode 100644 index 00000000..ea13dd62 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs new file mode 100644 index 00000000..8ad39f44 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnexpectedLogMessageException.cs.meta new file mode 100644 index 00000000..7b9e6115 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs new file mode 100644 index 00000000..9427cc86 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnhandledLogMessageException.cs.meta new file mode 100644 index 00000000..1019924b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs new file mode 100644 index 00000000..6e4243ef --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Assertions/UnityTestTimeoutException.cs.meta new file mode 100644 index 00000000..d366ec90 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions.meta new file mode 100644 index 00000000..3023e521 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e8d6af343b383544ba5743d119f4062 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs new file mode 100644 index 00000000..ed8d8963 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/ActionDelegator.cs.meta new file mode 100644 index 00000000..5f4e2d19 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta new file mode 100644 index 00000000..c7cae094 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0cb14878543cf3d4f8472b15f7ecf0e3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs new file mode 100644 index 00000000..2ef144cf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs @@ -0,0 +1,85 @@ +using System.Collections.Generic; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + /// + /// This attribute is an alternative to the standard `Ignore` attribute in [NUnit](https://nunit.org/). It allows for ignoring tests only under a specified condition. The condition evaluates during `OnLoad`, referenced by ID. + /// + public class ConditionalIgnoreAttribute : NUnitAttribute, IApplyToTest + { + string m_ConditionKey; + string m_IgnoreReason; + + /// + /// Initializes a new instance of the class with a condition key. + /// + /// The key to check for enabling the conditional ignore. The condition is set with the static method. + /// The reason for the ignore. + public ConditionalIgnoreAttribute(string conditionKey, string ignoreReason) + { + m_ConditionKey = conditionKey; + m_IgnoreReason = ignoreReason; + } + + /// + /// Modifies a test as defined for the specific attribute. + /// + /// The test to modify + 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(); + + /// + /// Adds a flag indicating whether tests with the same key should be ignored. + /// + /// The key to ignore tests for. + /// A boolean value indicating whether the tests should be ignored. + /// + /// An example in which tests are ignored in the Mac editor only. + /// + /// 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(); + /// } + /// } + /// + /// + public static void AddConditionalIgnoreMapping(string key, bool value) + { + m_ConditionMap.Add(key.ToLowerInvariant(), value); + } + } +} \ No newline at end of file diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/ConditionalIgnoreAttribute.cs.meta new file mode 100644 index 00000000..d7373354 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs new file mode 100644 index 00000000..6a4ab167 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestEnumerator.cs.meta new file mode 100644 index 00000000..6ca4f728 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs new file mode 100644 index 00000000..b0ad91f3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs @@ -0,0 +1,36 @@ +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 + { + /// + /// Initializes and returns an instance of TestMustExpectAllLogsAttribute. + /// + /// + /// A value indicating whether the test must expect all logs. + /// + public TestMustExpectAllLogsAttribute(bool mustExpect = true) + => MustExpect = mustExpect; + /// + /// Returns the flag of whether the test must expect all logs. + /// + public bool MustExpect { get; } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/TestMustExpectAllLogsAttribute.cs.meta new file mode 100644 index 00000000..82c5e47f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs new file mode 100644 index 00000000..84f8d845 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityCombinatorialStrategy.cs.meta new file mode 100644 index 00000000..84774ce9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs new file mode 100644 index 00000000..ae793f3a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; + +namespace UnityEngine.TestTools +{ + /// + /// 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 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 + /// + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] + public class UnityPlatformAttribute : NUnitAttribute, IApplyToTest + { + /// + /// A subset of platforms you need to have your tests run on. + /// + public RuntimePlatform[] include { get; set; } + /// + /// List the platforms you do not want to have your tests run on. + /// + public RuntimePlatform[] exclude { get; set; } + + private string m_skippedReason; + + /// + /// Constructs a new instance of the class. + /// + public UnityPlatformAttribute() + { + include = new List().ToArray(); + exclude = new List().ToArray(); + } + + /// + /// Constructs a new instance of the class with a list of platforms to include. + /// + /// The different to run the test on. + public UnityPlatformAttribute(params RuntimePlatform[] include) + : this() + { + this.include = include; + } + + /// + /// Modifies a test as defined for the specific attribute. + /// + /// The test to modify + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityPlatformAttribute.cs.meta new file mode 100644 index 00000000..003e1540 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs new file mode 100644 index 00000000..0abd4bac --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs @@ -0,0 +1,37 @@ +using System; +using NUnit.Framework; + +namespace UnityEngine.TestTools +{ + /// + /// The `UnitySetUp` and attributes are identical to the standard `SetUp` and `TearDown` attributes, with the exception that they allow for . 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). + /// + /// + ///public class SetUpTearDownExample + /// { + /// [UnitySetUp] + /// public IEnumerator SetUp() + /// { + /// yield return new EnterPlayMode(); + /// } + /// + /// [Test] + /// public void MyTest() + /// { + /// Debug.Log("This runs inside playmode"); + /// } + /// + /// [UnityTearDown] + /// public IEnumerator TearDown() + /// { + /// yield return new ExitPlayMode(); + /// } + /// } + /// + /// + /// + [AttributeUsage(AttributeTargets.Method)] + public class UnitySetUpAttribute : NUnitAttribute + { + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnitySetUpAttribute.cs.meta new file mode 100644 index 00000000..ccd0d7e0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs new file mode 100644 index 00000000..59be7c0d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs @@ -0,0 +1,37 @@ +using System; +using NUnit.Framework; + +namespace UnityEngine.TestTools +{ + /// + /// The and `UnityTearDown` attributes are identical to the standard `SetUp` and `TearDown` attributes, with the exception that they allow for . 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). + /// + /// + ///public class SetUpTearDownExample + /// { + /// [UnitySetUp] + /// public IEnumerator SetUp() + /// { + /// yield return new EnterPlayMode(); + /// } + /// + /// [Test] + /// public void MyTest() + /// { + /// Debug.Log("This runs inside playmode"); + /// } + /// + /// [UnityTearDown] + /// public IEnumerator TearDown() + /// { + /// yield return new ExitPlayMode(); + /// } + /// } + /// + /// + /// + [AttributeUsage(AttributeTargets.Method)] + public class UnityTearDownAttribute : NUnitAttribute + { + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTearDownAttribute.cs.meta new file mode 100644 index 00000000..db199044 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs new file mode 100644 index 00000000..310e484a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs @@ -0,0 +1,92 @@ +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 +{ + /// + /// `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: + /// + /// [UnityTest] + /// public IEnumerator EditorUtility_WhenExecuted_ReturnsSuccess() + /// { + /// var utility = RunEditorUtilityInTheBackground(); + /// + /// 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`: + /// + /// [UnityTest] + /// public IEnumerator GameObject_WithRigidBody_WillBeAffectedByPhysics() + /// { + /// var go = new GameObject(); + /// go.AddComponent<Rigidbody>(); + /// var originalPosition = go.transform.position.y; + /// + /// yield return new WaitForFixedUpdate(); + /// + /// Assert.AreNotEqual(originalPosition, go.transform.position.y); + /// } + /// + /// + /// + [AttributeUsage(AttributeTargets.Method)] + public class UnityTestAttribute : CombiningStrategyAttribute, ISimpleTestBuilder, IImplyFixture + { + /// + /// Initializes and returns an instance of UnityTestAttribute. + /// + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Attributes/UnityTestAttribute.cs.meta new file mode 100644 index 00000000..e2fcb633 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs new file mode 100644 index 00000000..65bcbbaa --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/BaseDelegator.cs.meta new file mode 100644 index 00000000..613537b8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands.meta new file mode 100644 index 00000000..75dd09d4 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b72875690e0f7343911e06af3145bd5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs new file mode 100644 index 00000000..92d82396 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs @@ -0,0 +1,235 @@ +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); + + // When entering PlayMode state will incorrectly be seen as null. Looking at the hashcode to be certain that it is null. + if (state?.GetHashCode() == 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandBase.cs.meta new file mode 100644 index 00000000..e3e48190 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs new file mode 100644 index 00000000..31734ee1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/BeforeAfterTestCommandState.cs.meta new file mode 100644 index 00000000..da9bd2bc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs new file mode 100644 index 00000000..d452f248 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableApplyChangesToContextCommand.cs.meta new file mode 100644 index 00000000..6a955cae --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs new file mode 100644 index 00000000..4b3f5ecd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs @@ -0,0 +1,66 @@ +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.EnumerableTestState.Repeat; + var firstCycleAfterResume = count > 0; + + while (count < repeatCount || (firstCycleAfterResume && count <= repeatCount)) + { + if (!firstCycleAfterResume) + { + count++; + } + + firstCycleAfterResume = false; + unityContext.EnumerableTestState.Repeat = 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.EnumerableTestState.Repeat = 0; + } + } +} \ No newline at end of file diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRepeatedTestCommand.cs.meta new file mode 100644 index 00000000..a738fba6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs new file mode 100644 index 00000000..39fbffa7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs @@ -0,0 +1,67 @@ +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.EnumerableTestState.Retry; + var firstCycleAfterResume = count > 0; + + while (count < retryCount || (firstCycleAfterResume && count <= retryCount)) + { + if (!firstCycleAfterResume) + { + count++; + } + + firstCycleAfterResume = false; + + unityContext.EnumerableTestState.Retry = 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.EnumerableTestState.Retry = 0; + } + } +} \ No newline at end of file diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableRetryTestCommand.cs.meta new file mode 100644 index 00000000..56f4e142 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs new file mode 100644 index 00000000..e5bf7b81 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableSetUpTearDownCommand.cs.meta new file mode 100644 index 00000000..e61d0499 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs new file mode 100644 index 00000000..2792aa3c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestMethodCommand.cs.meta new file mode 100644 index 00000000..4631e40b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestState.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestState.cs new file mode 100644 index 00000000..9326189c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestState.cs @@ -0,0 +1,8 @@ +namespace UnityEngine.TestTools +{ + internal class EnumerableTestState : ScriptableObject + { + public int Repeat; + public int Retry; + } +} \ No newline at end of file diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestState.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestState.cs.meta new file mode 100644 index 00000000..44633312 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/EnumerableTestState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 356852e4738840b4b1ab533d3a66f0e1 +timeCreated: 1606321047 \ No newline at end of file diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs new file mode 100644 index 00000000..ae1b7b7e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/ImmediateEnumerableCommand.cs.meta new file mode 100644 index 00000000..e650b549 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs new file mode 100644 index 00000000..a0646f13 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/OuterUnityTestActionCommand.cs.meta new file mode 100644 index 00000000..64158729 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs new file mode 100644 index 00000000..c6ff0d9c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/SetUpTearDownCommand.cs.meta new file mode 100644 index 00000000..28b84ace --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs new file mode 100644 index 00000000..9b99dd0d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/TestActionCommand.cs.meta new file mode 100644 index 00000000..3f44e9d7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs new file mode 100644 index 00000000..26eb4b03 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Commands/TestCommandPcHelper.cs.meta new file mode 100644 index 00000000..1dbd4f43 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs new file mode 100644 index 00000000..dd7fbc29 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/ConstructDelegator.cs.meta new file mode 100644 index 00000000..cb04fc8a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters.meta new file mode 100644 index 00000000..a0aa9946 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c3de99f9efc582a48995bc8e8c2df418 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs new file mode 100644 index 00000000..d53a2d0f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters/AssemblyNameFilter.cs.meta new file mode 100644 index 00000000..2b897451 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs new file mode 100644 index 00000000..58430e8c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Filters/CategoryFilterExtended.cs.meta new file mode 100644 index 00000000..a115cd20 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs new file mode 100644 index 00000000..6bc15932 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/IAsyncTestAssemblyBuilder.cs.meta new file mode 100644 index 00000000..64283a34 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs new file mode 100644 index 00000000..951d079e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/IStateSerializer.cs.meta new file mode 100644 index 00000000..1d327152 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner.meta new file mode 100644 index 00000000..1604cb56 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37888acc09d9ee848bf9559f06645c45 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs new file mode 100644 index 00000000..b2666004 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs @@ -0,0 +1,359 @@ +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() + { + var logScope = new LogScope(); + try + { + _teardownCommand.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 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/CompositeWorkItem.cs.meta new file mode 100644 index 00000000..355dd71d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs new file mode 100644 index 00000000..666a8dd6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/CoroutineTestWorkItem.cs.meta new file mode 100644 index 00000000..f5eb9983 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs new file mode 100644 index 00000000..6690ecc6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/DefaultTestWorkItem.cs.meta new file mode 100644 index 00000000..a843b77a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs new file mode 100644 index 00000000..a01769dd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/FailCommand.cs.meta new file mode 100644 index 00000000..921cc0ae --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs new file mode 100644 index 00000000..758e2956 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/IEnumerableTestMethodCommand.cs.meta new file mode 100644 index 00000000..4434337b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs new file mode 100644 index 00000000..5d32f268 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/PlaymodeWorkItemFactory.cs.meta new file mode 100644 index 00000000..9c2a8eda --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs new file mode 100644 index 00000000..e05910ab --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs @@ -0,0 +1,4 @@ +namespace UnityEngine.TestRunner.NUnitExtensions.Runner +{ + internal class RestoreTestContextAfterDomainReload {} +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/RestoreTestContextAfterDomainReload.cs.meta new file mode 100644 index 00000000..640354d6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs new file mode 100644 index 00000000..0a0c1c3e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/TestCommandBuilder.cs.meta new file mode 100644 index 00000000..769bce6b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs new file mode 100644 index 00000000..b0104651 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs @@ -0,0 +1,144 @@ +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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityLogCheckDelegatingCommand.cs.meta new file mode 100644 index 00000000..86d9d9ea --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs new file mode 100644 index 00000000..96ed23a1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestAssemblyRunner.cs.meta new file mode 100644 index 00000000..96179c58 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs new file mode 100644 index 00000000..a7072ed6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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; + EnumerableTestState = other.EnumerableTestState; + + 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 EnumerableTestState EnumerableTestState { get; set; } + + internal int AssertCount + { + get + { + return _assertCount; + } + } + + public void IncrementAssertCount() + { + _assertCount += 1; + } + + public void AddFormatter(ValueFormatterFactory formatterFactory) + { + throw new NotImplementedException(); + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityTestExecutionContext.cs.meta new file mode 100644 index 00000000..33d323b6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs new file mode 100644 index 00000000..9a3a46be --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItem.cs.meta new file mode 100644 index 00000000..48b9f92d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs new file mode 100644 index 00000000..d9fb7004 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/UnityWorkItemDataHolder.cs.meta new file mode 100644 index 00000000..6d90872b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs new file mode 100644 index 00000000..94d9c0fe --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/Runner/WorkItemFactory.cs.meta new file mode 100644 index 00000000..e5f03777 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs new file mode 100644 index 00000000..7e740307 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/TestExtensions.cs.meta new file mode 100644 index 00000000..3230eb44 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs new file mode 100644 index 00000000..d79072b0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/TestResultExtensions.cs.meta new file mode 100644 index 00000000..ff97b17b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs new file mode 100644 index 00000000..79f4aa5d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/NUnitExtensions/UnityTestAssemblyBuilder.cs.meta new file mode 100644 index 00000000..f0fdf171 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner.meta new file mode 100644 index 00000000..e44f8794 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ddb9e1c877ea80479d1eab4ddaa5d0d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks.meta new file mode 100644 index 00000000..899ce792 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 61e236e8570a95e4eb754fb291e102e0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs new file mode 100644 index 00000000..d7926873 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/PlayModeRunnerCallback.cs.meta new file mode 100644 index 00000000..15706d58 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs new file mode 100644 index 00000000..267048ce --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/PlayerQuitHandler.cs.meta new file mode 100644 index 00000000..9d849901 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs new file mode 100644 index 00000000..755ac83f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/RemoteTestResultSender.cs.meta new file mode 100644 index 00000000..cbb4d406 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs new file mode 100644 index 00000000..3d59430e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRenderer.cs.meta new file mode 100644 index 00000000..02cca205 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs new file mode 100644 index 00000000..b5d23f7f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Callbacks/TestResultRendererCallback.cs.meta new file mode 100644 index 00000000..deaa0ae6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs new file mode 100644 index 00000000..6a2fa5b2 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/ITestRunnerListener.cs.meta new file mode 100644 index 00000000..848ab3d9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Messages.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Messages.meta new file mode 100644 index 00000000..5ab167cc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Messages.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 256a0ca37fa972840bce7fca446e75e7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs new file mode 100644 index 00000000..0e68ab59 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs @@ -0,0 +1,28 @@ +using System.Collections; + +namespace UnityEngine.TestTools +{ + /// + /// 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: + /// - [EnterPlayMore](https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/api/UnityEngine.TestTools.EnterPlayMode.html) + /// - + /// - + /// - + /// + public interface IEditModeTestYieldInstruction + { + /// + /// Whether or not the instruction expects a domain reload to occur. + /// + bool ExpectDomainReload { get; } + /// + /// Whether or not the instruction expects the Unity Editor to be in **Play Mode**. + /// + bool ExpectedPlaymodeState { get; } + /// + /// Used to define multi-frame operations performed when instantiating a yield instruction. + /// + /// Enumerable collection of operations to perform. + IEnumerator Perform(); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/Messages/IEditModeTestYieldInstruction.cs.meta new file mode 100644 index 00000000..f61c35ae --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs new file mode 100644 index 00000000..87091ca1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/PlaymodeTestsController.cs.meta new file mode 100644 index 00000000..96937783 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs new file mode 100644 index 00000000..cb6bb54b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/PlaymodeTestsControllerSettings.cs.meta new file mode 100644 index 00000000..06448a7f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta new file mode 100644 index 00000000..d23c0a71 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91c20d2c22b8b3a4cb6c816bd225591a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs new file mode 100644 index 00000000..fffba298 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/IRemoteTestResultDataFactory.cs.meta new file mode 100644 index 00000000..3bc8e30f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs new file mode 100644 index 00000000..162ad0b5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/PlayerConnectionMessageIds.cs.meta new file mode 100644 index 00000000..bf86f7ec --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs new file mode 100644 index 00000000..6559b451 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestData.cs.meta new file mode 100644 index 00000000..0c286dcd --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs new file mode 100644 index 00000000..90f82a42 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultData.cs.meta new file mode 100644 index 00000000..a213e6be --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs new file mode 100644 index 00000000..0b3cd035 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataFactory.cs.meta new file mode 100644 index 00000000..bc0dd7c9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs new file mode 100644 index 00000000..36124cc7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RemoteHelpers/RemoteTestResultDataWithTestData.cs.meta new file mode 100644 index 00000000..ffab8f68 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs new file mode 100644 index 00000000..0adca0a4 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/RuntimeTestRunnerFilter.cs.meta new file mode 100644 index 00000000..5f9aa3b6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs new file mode 100644 index 00000000..525da47a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/SynchronousFilter.cs.meta new file mode 100644 index 00000000..08c6010a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs new file mode 100644 index 00000000..5ed2ec84 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestEnumeratorWrapper.cs.meta new file mode 100644 index 00000000..f19ee3e3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs new file mode 100644 index 00000000..ffa23de5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestListenerWrapper.cs.meta new file mode 100644 index 00000000..aefe0393 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestPlatform.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestPlatform.cs new file mode 100644 index 00000000..ebd7d96a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestPlatform.cs @@ -0,0 +1,33 @@ +using System; + +namespace UnityEngine.TestTools +{ + /// + /// A flag indicating the targeted test platforms. + /// + [Flags] + [Serializable] + public enum TestPlatform : byte + { + /// + /// Both platforms. + /// + All = 0xFF, + /// + /// The EditMode test platform. + /// + EditMode = 1 << 1, + /// + /// The PlayMode test platform. + /// + PlayMode = 1 << 2 + } + + internal static class TestPlatformEnumExtensions + { + public static bool IsFlagIncluded(this TestPlatform flags, TestPlatform flag) + { + return (flags & flag) == flag; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestPlatform.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/TestRunner/TestPlatform.cs.meta new file mode 100644 index 00000000..6eb087a7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef new file mode 100644 index 00000000..6dc17daa --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta new file mode 100644 index 00000000..a2002fd6 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/UnityEngine.TestRunner.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 27619889b8ba8c24980f49ee34dbb44a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils.meta new file mode 100644 index 00000000..d9503ad3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb32bccaf32a6db448d1c0cc99c78688 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider.meta new file mode 100644 index 00000000..a8326f06 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 51557afa652635743b264a309f0a5c60 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs new file mode 100644 index 00000000..9edc5171 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyLoadProxy.cs.meta new file mode 100644 index 00000000..8bb527d9 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs new file mode 100644 index 00000000..86a39cb8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs @@ -0,0 +1,33 @@ +using System; +using System.Reflection; + +namespace UnityEngine.TestTools.Utils +{ + internal class AssemblyWrapper : IAssemblyWrapper + { + public AssemblyWrapper(Assembly assembly) + { + Assembly = assembly; + Name = assembly.GetName(); + } + + public Assembly Assembly { get; } + + public AssemblyName Name { 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/AssemblyWrapper.cs.meta new file mode 100644 index 00000000..1e4a7184 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs new file mode 100644 index 00000000..feffa62e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools.Utils +{ + internal interface IAssemblyLoadProxy + { + IAssemblyWrapper Load(string assemblyString); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyLoadProxy.cs.meta new file mode 100644 index 00000000..284d33b0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs new file mode 100644 index 00000000..e8205714 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs @@ -0,0 +1,12 @@ +using System.Reflection; + +namespace UnityEngine.TestTools.Utils +{ + internal interface IAssemblyWrapper + { + Assembly Assembly { get; } + AssemblyName Name { get; } + string Location { get; } + AssemblyName[] GetReferencedAssemblies(); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IAssemblyWrapper.cs.meta new file mode 100644 index 00000000..486888d5 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs new file mode 100644 index 00000000..0dc2b7f3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs @@ -0,0 +1,7 @@ +namespace UnityEngine.TestTools.Utils +{ + internal interface IScriptingRuntimeProxy + { + string[] GetAllUserAssemblies(); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/IScriptingRuntimeProxy.cs.meta new file mode 100644 index 00000000..85ae9850 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs new file mode 100644 index 00000000..74f27692 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/ITestAssemblyProvider.cs.meta new file mode 100644 index 00000000..d7e856b7 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs new file mode 100644 index 00000000..bb0aa941 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/PlayerTestAssemblyProvider.cs.meta new file mode 100644 index 00000000..ffee12cf --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs new file mode 100644 index 00000000..0f1eb2bc --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AssemblyProvider/ScriptingRuntimeProxy.cs.meta new file mode 100644 index 00000000..7b16cb9f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AttributeHelper.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AttributeHelper.cs new file mode 100644 index 00000000..7d710cb8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AttributeHelper.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/AttributeHelper.cs.meta new file mode 100644 index 00000000..cc47e6f1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs new file mode 100644 index 00000000..e22df481 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs @@ -0,0 +1,80 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + /// + /// 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. + /// + public class ColorEqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.01f; + private readonly float AllowedError; + + + private static readonly ColorEqualityComparer m_Instance = new ColorEqualityComparer(); + /// + ///A singleton instance of the comparer with a default error value set to 0.01f. + /// + public static ColorEqualityComparer Instance { get { return m_Instance; } } + + private ColorEqualityComparer() : this(k_DefaultError) + { + } + /// + /// Creates an instance of the comparer with a custom error value. + /// + /// The custom error value. + public ColorEqualityComparer(float error) + { + this.AllowedError = error; + } + + /// + /// Compares the actual and expected Color objects for equality using to compare the RGB and Alpha attributes of Color. Returns true if expected and actual objects are equal otherwise, it returns false. + /// + /// The expected Color value used to compare. + /// The actual Color value to test. + /// True if actual and expected are equal, false otherwise + /// + /// + /// [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)); + /// } + /// } + /// + /// + 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); + } + + /// + /// Serves as the default hash function. + /// + /// A not null Color object. + /// Returns 0. + public int GetHashCode(Color color) + { + return 0; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ColorEqualityComparer.cs.meta new file mode 100644 index 00000000..42da0754 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/CoroutineRunner.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/CoroutineRunner.cs new file mode 100644 index 00000000..6e574203 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/CoroutineRunner.cs @@ -0,0 +1,100 @@ +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_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_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_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(); + StopAllRunningCoroutines(); + m_Context.CurrentResult.RecordException(new UnityTestTimeoutException(m_Context.TestCaseTimeout)); + } + } + + public bool HasFailedWithTimeout() + { + return m_Timeout; + } + + public int GetDefaultTimeout() + { + return k_DefaultTimeout; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/CoroutineRunner.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/CoroutineRunner.cs.meta new file mode 100644 index 00000000..756d54ee --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs new file mode 100644 index 00000000..718a7775 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + /// + /// Use this class to compare two float values for equality with NUnit constraints. Use FloatEqualityComparer.Instance comparer to have the default error value set to 0.0001f. For any other error, use the one argument constructor to create a comparer. + /// + public class FloatEqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly FloatEqualityComparer m_Instance = new FloatEqualityComparer(); + /// + ///A singleton instance of the comparer with a default error value set to 0.0001f. + /// + public static FloatEqualityComparer Instance { get { return m_Instance; } } + + private FloatEqualityComparer() : this(k_DefaultError) {} + + /// + /// Initializes an instance of a FloatEqualityComparer with a custom error value instead of the default 0.0001f. + /// + /// The custom error value + public FloatEqualityComparer(float allowedError) + { + this.AllowedError = allowedError; + } + + /// + /// Compares the actual and expected float values for equality using . + /// + /// The expected float value used to compare. + /// The actual float value to test. + /// True if the values are equals, false otherwise. + /// + /// + /// [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)); + /// } + ///} + /// + /// + public bool Equals(float expected, float actual) + { + return Utils.AreFloatsEqual(expected, actual, AllowedError); + } + + /// + /// Serves as the default hash function. + /// + /// A not null float number. + /// Returns 0. + public int GetHashCode(float value) + { + return 0; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/FloatEqualityComparer.cs.meta new file mode 100644 index 00000000..74971310 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs new file mode 100644 index 00000000..add5a050 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs @@ -0,0 +1,21 @@ +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. + /// Enumerable collection of actions to perform before test setup. + IEnumerator BeforeTest(ITest test); + + /// Executed after each test is run + /// The test that has just been run. + /// Enumerable collection of actions to perform after test teardown. + IEnumerator AfterTest(ITest test); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IOuterUnityTestAction.cs.meta new file mode 100644 index 00000000..93429d44 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs new file mode 100644 index 00000000..04d7f328 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs @@ -0,0 +1,13 @@ +namespace UnityEngine.TestTools +{ + /// + /// 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 interface IPostBuildCleanup + { + /// + /// Implement this method to specify actions that should run as a post-build cleanup step. + /// + void Cleanup(); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPostBuildCleanup.cs.meta new file mode 100644 index 00000000..f1cb9a92 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs new file mode 100644 index 00000000..512b52e3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs @@ -0,0 +1,59 @@ +namespace UnityEngine.TestTools +{ + /// + /// Implement this interface if you want to define a set of actions to run as a pre-build step. + /// + public interface IPrebuildSetup + { + /// + /// Implement this method to call actions automatically before the build process. + /// + /// + /// + /// [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<Texture2D>("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.height), new Vector2(0.5f, 0.5f)); + /// + /// Assert.That(m_Sprite, Is.Null, "Sprite created with null texture should be null"); + /// } + /// } + /// + /// + void Setup(); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/IPrebuildSceneSetup.cs.meta new file mode 100644 index 00000000..77dff879 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ITestRunCallback.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ITestRunCallback.cs new file mode 100644 index 00000000..c9759c67 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ITestRunCallback.cs @@ -0,0 +1,31 @@ +using NUnit.Framework.Interfaces; + +namespace UnityEngine.TestRunner +{ + /// + /// Interface for getting callsbacks on test progress directly from NUnit. This is available both in the editor and directly in the runtime. It is registered by using . + /// + public interface ITestRunCallback + { + /// + /// A callback invoked when a test run is started. + /// + /// The full loaded test tree. + void RunStarted(ITest testsToRun); + /// + /// A callback invoked when a test run is finished. + /// + /// The result of the test run. + void RunFinished(ITestResult testResults); + /// + /// A callback invoked when each individual node of the test tree has started executing. + /// + /// The test node currently executed. + void TestStarted(ITest test); + /// + /// A callback invoked when each individual node of the test tree has finished executing. + /// + /// The result of the test tree node after it had been executed. + void TestFinished(ITestResult result); + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ITestRunCallback.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/ITestRunCallback.cs.meta new file mode 100644 index 00000000..09f6f53d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta new file mode 100644 index 00000000..5da2eb98 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce8da628f68c7594b8b9a597fa52db7b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs new file mode 100644 index 00000000..38502c9b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs @@ -0,0 +1,11 @@ +namespace UnityEngine.TestTools +{ + /// + /// An interface implemented by a MonoBehaviour test. + /// + public interface IMonoBehaviourTest + { + /// True when the test is considered finished. + bool IsTestFinished {get; } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/IMonoBehaviourTest.cs.meta new file mode 100644 index 00000000..9af40042 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs new file mode 100644 index 00000000..56571793 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs @@ -0,0 +1,60 @@ +namespace UnityEngine.TestTools +{ + /// + /// This is a wrapper that allows running tests on MonoBehaviour scripts. Inherits from . + /// + /// A MonoBehaviour component created for the test and attached to the tests [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html). + public class MonoBehaviourTest : CustomYieldInstruction where T : MonoBehaviour, IMonoBehaviourTest + { + /// A MonoBehaviour component created for the test and attached to the tests [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html). + public T component { get; } + /// + /// A `GameObject` created as a container for the test component. + /// + public GameObject gameObject { get { return component.gameObject; } } + /// + /// `MonoBehaviourTest` is a [coroutine](https://docs.unity3d.com/ScriptReference/Coroutine.html) and a helper for writing MonoBehaviour tests. + /// Yield a `MonoBehaviour`Test 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. + /// + /// + /// + /// + /// [UnityTest] + /// public IEnumerator MonoBehaviourTest_Works() + /// { + /// yield return new MonoBehaviourTest<MyMonoBehaviourTest>(); + /// } + /// + /// public class MyMonoBehaviourTest : MonoBehaviour, IMonoBehaviourTest + /// { + /// private int frameCount; + /// public bool IsTestFinished + /// { + /// get { return frameCount > 10; } + /// } + /// + /// void Update() + /// { + /// frameCount++; + /// } + /// } + /// + /// + public MonoBehaviourTest(bool dontDestroyOnLoad = true) + { + var go = new GameObject("MonoBehaviourTest: " + typeof(T).FullName); + component = go.AddComponent(); + if (dontDestroyOnLoad) + { + Object.DontDestroyOnLoad(go); + } + } + /// + /// (Inherited) Returns `true`` if the test is not finished yet, which keeps the coroutine suspended + /// + public override bool keepWaiting + { + get { return !component.IsTestFinished; } + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/MonoBehaviourTest/MonoBehaviourTest.cs.meta new file mode 100644 index 00000000..c727f85a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs new file mode 100644 index 00000000..e93804be --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs @@ -0,0 +1,23 @@ +using System; + +namespace UnityEngine.TestTools +{ + /// + /// 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](https://docs.unity3d.com/Packages/com.unity.test-framework@1.1/manual/workflow-create-test.html#filters) that includes the test. If multiple tests reference the same pre-built setup or post-build cleanup, then it only runs once. + /// + [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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PostBuildCleanupAttribute.cs.meta new file mode 100644 index 00000000..b45a7a66 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs new file mode 100644 index 00000000..1e4f2d16 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs @@ -0,0 +1,70 @@ +using System; + +namespace UnityEngine.TestTools +{ + /// + /// PrebuildSetup attribute run if the test or test class is in the current test run. The test is included either by running all tests or setting a filter that includes the test. If multiple tests reference the same pre-built setup or post-build cleanup, then it only runs once. + /// + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class PrebuildSetupAttribute : Attribute + { + public PrebuildSetupAttribute(Type targetClass) + { + TargetClass = targetClass; + } + /// + /// + /// + /// + /// + /// + /// [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<Texture2D>("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. + /// + public PrebuildSetupAttribute(string targetClassName) + { + TargetClass = AttributeHelper.GetTargetClassFromName(targetClassName, typeof(IPrebuildSetup)); + } + + internal Type TargetClass { get; private set; } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/PrebuildSceneSetupAttribute.cs.meta new file mode 100644 index 00000000..7b6ae4a8 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs new file mode 100644 index 00000000..fec8256a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs @@ -0,0 +1,80 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + /// + /// Use this utility to compare two Quaternion objects for equality + /// with NUnit 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. + /// + public class QuaternionEqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.00001f; + private readonly float AllowedError; + + private static readonly QuaternionEqualityComparer m_Instance = new QuaternionEqualityComparer(); + /// + ///A comparer instance with the default error value 0.00001f. + /// + public static QuaternionEqualityComparer Instance { get { return m_Instance; } } + + + private QuaternionEqualityComparer() : this(k_DefaultError) {} + /// + /// Creates an instance of the comparer with a custom allowed error value. + /// + /// Describes the custom allowed error value + public QuaternionEqualityComparer(float allowedError) + { + AllowedError = allowedError; + } + + /// + /// Compares the actual and expected Quaternion objects + /// for equality using the method. + /// + /// Expected Quaternion value used for comparison + /// Actual Quaternion value to test + /// True if the quaternion are equals, false otherwise. + /// + /// The following example shows how to verify if two Quaternion are equals + /// + /// [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)); + /// } + /// } + /// + /// + public bool Equals(Quaternion expected, Quaternion actual) + { + return Mathf.Abs(Quaternion.Dot(expected, actual)) > (1.0f - AllowedError); + } + + /// + /// Serves as the default hash function. + /// + /// A not null Quaternion + /// Returns 0 + public int GetHashCode(Quaternion quaternion) + { + return 0; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/QuaternionEqualityComparer.cs.meta new file mode 100644 index 00000000..31faf0c3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/StacktraceFilter.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/StacktraceFilter.cs new file mode 100644 index 00000000..af431f33 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/StacktraceFilter.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/StacktraceFilter.cs.meta new file mode 100644 index 00000000..4f837a1a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs new file mode 100644 index 00000000..bb98f954 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs @@ -0,0 +1,68 @@ +using System; +using UnityEngine.Scripting; + +namespace UnityEngine.TestRunner +{ + /// + /// An assembly level attribute that indicates that a given type should be subscribed for receiving updates on the test progress. + /// + /// + /// + /// using NUnit.Framework.Interfaces; + /// using UnityEngine; + /// using UnityEngine.TestRunner; + /// + /// [assembly:TestRunCallback(typeof(TestListener))] + /// + /// public class TestListener : ITestRunCallback + /// { + /// public void RunStarted(ITest testsToRun) + /// { + /// + /// } + /// + /// public void RunFinished(ITestResult testResults) + /// { + /// Debug.Log($"Run finished with result {testResults.ResultState}."); + /// } + /// + /// public void TestStarted(ITest test) + /// { + /// + /// } + /// + /// public void TestFinished(ITestResult result) + /// { + /// + /// } + ///} + /// + /// + [AttributeUsage(AttributeTargets.Assembly)] + public class TestRunCallbackAttribute : Attribute + { + private Type m_Type; + + /// + /// Constructs a new instance of the class. + /// + /// A target type that implements . + /// Throws an ArgumentException if the provided type does not implement . + public TestRunCallbackAttribute(Type type) + { + var interfaceType = typeof(ITestRunCallback); + if (!interfaceType.IsAssignableFrom(type)) + { + throw new ArgumentException(string.Format( + "Type {2} provided to {0} does not implement {1}. If the stripping level is set to high, the implementing class should have the {3}.", + this.GetType().Name, interfaceType.Name, type.Name, typeof(PreserveAttribute).Name)); + } + m_Type = type; + } + + internal ITestRunCallback ConstructCallback() + { + return Activator.CreateInstance(m_Type) as ITestRunCallback; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/TestRunCallbackAttribute.cs.meta new file mode 100644 index 00000000..06b20189 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs new file mode 100644 index 00000000..d4a8c40a --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/TestRunCallbackListener.cs.meta new file mode 100644 index 00000000..77f82eed --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Utils.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Utils.cs new file mode 100644 index 00000000..23c3324f --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Utils.cs @@ -0,0 +1,94 @@ +using System; + +namespace UnityEngine.TestTools.Utils +{ + /// + /// This contains test utility functions for float value comparison and creating primitives. + /// + public static class Utils + { + /// + /// Relative epsilon comparison of two float values for equality. + /// The relative error is the absolute error divided by the magnitude of the exact value. + /// + /// The expected float value used to compare. + /// The actual float value to test. + /// Epsilon is the relative error to be used in relative epsilon comparison. + /// Returns true if the actual value is equivalent to the expected value. + /// + /// + /// [TestFixture] + /// class UtilsTests + /// { + /// [Test] + /// public void CheckThat_FloatsAreEqual() + /// { + /// float expected = 10e-8f; + /// float actual = 0f; + /// float allowedRelativeError = 10e-6f; + /// + /// Assert.That(Utils.AreFloatsEqual(expected, actual, allowedRelativeError), Is.True); + /// } + /// } + /// + /// + 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); + } + + /// + /// Compares two floating point numbers for equality under the given absolute tolerance. + /// + /// The expected float value used to compare. + /// The actual float value to test. + /// AllowedAbsoluteError is the permitted error tolerance. + /// Returns true if the actual value is equivalent to the expected value under the given tolerance. + /// + /// + /// + /// [TestFixture] + /// class UtilsTests + /// { + /// [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); + /// } + /// } + /// + /// + 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. + /// The type of primitive object to create. + 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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Utils.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Utils.cs.meta new file mode 100644 index 00000000..63b9c66c --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs new file mode 100644 index 00000000..94bdf26b --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + /// + /// Use these classes to compare two objects of the same type for equality within the range of a given tolerance using NUnit or custom constraints . Call Instance to apply the default calculation error value to the comparison. + /// + public class Vector2ComparerWithEqualsOperator : IEqualityComparer + { + private static readonly Vector2ComparerWithEqualsOperator m_Instance = new Vector2ComparerWithEqualsOperator(); + /// + /// A singleton instance of the comparer with a predefined default error value. + /// + public static Vector2ComparerWithEqualsOperator Instance { get { return m_Instance; } } + + private Vector2ComparerWithEqualsOperator() {} + /// + /// Compares the actual and expected objects for equality using a custom comparison mechanism. + /// + /// Expected Vector2 used to compare + /// Actual Vector2 value to test. + /// Returns true if expected and actual objects are equal, otherwise it returns false. + /// + /// + /// [TestFixture] + /// public class Vector2Test + /// { + /// [Test] + /// public void VerifyThat_TwoVector2ObjectsAreEqual() + /// { + /// var actual = new Vector2(10e-7f, 10e-7f); + /// var expected = new Vector2(0f, 0f); + /// + /// Assert.That(actual, Is.EqualTo(expected).Using(Vector2ComparerWithEqualsOperator.Instance)); + /// } + /// } + /// + /// + public bool Equals(Vector2 expected, Vector2 actual) + { + return expected == actual; + } + /// + /// Serves as the default hash function. + /// + /// A not null Vector2 object + /// Returns 0 + public int GetHashCode(Vector2 vec2) + { + return 0; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2ComparerWithEqualsOperator.cs.meta new file mode 100644 index 00000000..07662bb3 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs new file mode 100644 index 00000000..c8a23e28 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + /// + /// Use this class to compare two Vector2 objects for + /// equality with NUnit constraints. Use the static + /// + /// 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. + /// + public class Vector2EqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly Vector2EqualityComparer m_Instance = new Vector2EqualityComparer(); + + /// + /// A comparer instance with the default error value set to 0.0001f. + /// + public static Vector2EqualityComparer Instance { get { return m_Instance; } } + + private Vector2EqualityComparer() : this(k_DefaultError) + { + } + /// + /// Initializes an instance of Vector2Equality comparer with custom allowed calculation error. + /// + /// This value identifies the calculation error allowed. + public Vector2EqualityComparer(float error) + { + this.AllowedError = error; + } + /// + /// Compares the actual and expected Vector2 objects for equality using the method. + /// + /// The expected Vector2 used for comparison + /// The actual Vector2 to test + /// True if the vectors are equals, false otherwise. + /// + /// The following example shows how to verify if two Vector2 are equals + /// + ///[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)); + /// } + /// } + /// + /// + public bool Equals(Vector2 expected, Vector2 actual) + { + return Utils.AreFloatsEqual(expected.x, actual.x, AllowedError) && + Utils.AreFloatsEqual(expected.y, actual.y, AllowedError); + } + /// + /// Serves as the default hash function. + /// + /// A not null Vector2 + /// Returns 0 + public int GetHashCode(Vector2 vec2) + { + return 0; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector2EqualityComparer.cs.meta new file mode 100644 index 00000000..ed2951a1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs new file mode 100644 index 00000000..403dd137 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + /// + /// Use these classes to compare two objects of the same type for equality within the range of a given tolerance using NUnit or custom constraints . Call Instance to apply the default calculation error value to the comparison. + /// + public class Vector3ComparerWithEqualsOperator : IEqualityComparer + { + private static readonly Vector3ComparerWithEqualsOperator m_Instance = new Vector3ComparerWithEqualsOperator(); + /// + /// A singleton instance of the comparer with a predefined default error value. + /// + public static Vector3ComparerWithEqualsOperator Instance { get { return m_Instance; } } + + private Vector3ComparerWithEqualsOperator() {} + /// + /// Compares the actual and expected objects for equality using a custom comparison mechanism. + /// + /// Expected Vector3 used to compare + /// Actual Vector3 value to test. + /// Returns true if expected and actual objects are equal, otherwise it returns false. + /// + /// + /// [TestFixture] + /// public class Vector3Test + /// { + /// [Test] + /// public void VerifyThat_TwoVector3ObjectsAreEqual() + /// { + /// var actual = new Vector2(10e-7f, 10e-7f, 10e-7f); + /// var expected = new Vector2(0f, 0f, 0f); + /// + /// Assert.That(actual, Is.EqualTo(expected).Using(Vector3ComparerWithEqualsOperator.Instance)); + /// } + /// } + /// + /// + public bool Equals(Vector3 expected, Vector3 actual) + { + return expected == actual; + } + /// + /// Serves as the default hash function. + /// + /// A not null Vector3 object + /// Returns 0 + public int GetHashCode(Vector3 vec3) + { + return 0; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3ComparerWithEqualsOperator.cs.meta new file mode 100644 index 00000000..01662a49 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs new file mode 100644 index 00000000..1e18a1b0 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; + + +namespace UnityEngine.TestTools.Utils +{ + /// + /// Use this class to compare two Vector3 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 to instantiate a new comparer. + /// + public class Vector3EqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly Vector3EqualityComparer m_Instance = new Vector3EqualityComparer(); + + /// + /// A comparer instance with the default calculation error value equal to 0.0001f. + /// + public static Vector3EqualityComparer Instance { get { return m_Instance; } } + + private Vector3EqualityComparer() : this(k_DefaultError) {} + + /// + /// Initializes an instance of Vector3Equality comparer with custom allowed calculation error. + /// + /// This value identifies the calculation error allowed. + public Vector3EqualityComparer(float allowedError) + { + this.AllowedError = allowedError; + } + /// + /// Compares the actual and expected Vector3 objects + /// for equality using to compare the x, y, and z attributes of Vector3. + /// + /// The expected Vector3 used for comparison + /// The actual Vector3 to test + /// True if the vectors are equals, false otherwise. + /// + /// The following example shows how to verify if two Vector3 are equals + /// + /// [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)); + /// } + /// } + /// + /// + + 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); + } + + /// + /// Serves as the default hash function. + /// + /// A not null Vector3 + /// Returns 0 + public int GetHashCode(Vector3 vec3) + { + return 0; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector3EqualityComparer.cs.meta new file mode 100644 index 00000000..37e0a03e --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs new file mode 100644 index 00000000..3d265e34 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + /// + /// Use these classes to compare two objects of the same type for equality within the range of a given tolerance using NUnit or custom constraints . Call Instance to apply the default calculation error value to the comparison. + /// + public class Vector4ComparerWithEqualsOperator : IEqualityComparer + { + private static readonly Vector4ComparerWithEqualsOperator m_Instance = new Vector4ComparerWithEqualsOperator(); + /// + /// A singleton instance of the comparer with a predefined default error value. + /// + public static Vector4ComparerWithEqualsOperator Instance { get { return m_Instance; } } + + private Vector4ComparerWithEqualsOperator() {} + /// + /// Compares the actual and expected objects for equality using a custom comparison mechanism. + /// + /// Expected Vector4 used to compare + /// Actual Vector4 value to test. + /// Returns true if expected and actual objects are equal, otherwise it returns false. + /// + /// + /// [TestFixture] + /// public class Vector4Test + /// { + /// [Test] + /// public void VerifyThat_TwoVector4ObjectsAreEqual() + /// { + /// var actual = new Vector4(10e-7f, 10e-7f, 10e-7f, 10e-7f); + /// var expected = new Vector4(0f, 0f, 0f, 0f); + /// + /// Assert.That(actual, Is.EqualTo(expected).Using(Vector4ComparerWithEqualsOperator.Instance)); + /// } + /// } + /// + /// + public bool Equals(Vector4 expected, Vector4 actual) + { + return expected == actual; + } + /// + /// Serves as the default hash function. + /// + /// A not null Vector4 object + /// Returns 0 + public int GetHashCode(Vector4 vec4) + { + return 0; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4ComparerWithEqualsOperator.cs.meta new file mode 100644 index 00000000..a23cf663 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs new file mode 100644 index 00000000..a234413d --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs @@ -0,0 +1,77 @@ +using System.Collections.Generic; + +namespace UnityEngine.TestTools.Utils +{ + /// + /// Use this class to compare two Vector4 objects for equality with NUnit 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. + /// + public class Vector4EqualityComparer : IEqualityComparer + { + private const float k_DefaultError = 0.0001f; + private readonly float AllowedError; + + private static readonly Vector4EqualityComparer m_Instance = new Vector4EqualityComparer(); + /// + /// A comparer instance with the default calculation error value set to 0.0001f. + /// + public static Vector4EqualityComparer Instance { get { return m_Instance; } } + + private Vector4EqualityComparer() : this(k_DefaultError) {} + /// + /// Initializes an instance of Vector4Equality comparer with custom allowed calculation error. + /// + /// This value identifies the calculation error allowed. + public Vector4EqualityComparer(float allowedError) + { + this.AllowedError = allowedError; + } + + /// + /// Compares the actual and expected Vector4 objects for equality using to compare the x, y, z, and w attributes of Vector4. + /// + /// The expected Vector4 used for comparison + /// The actual Vector4 to test + /// True if the vectors are equals, false otherwise. + /// + /// + ///[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)); + /// } + /// } + /// + /// + 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); + } + + /// + /// Serves as the default hash function. + /// + /// A not null Vector4 object + /// Returns 0 + public int GetHashCode(Vector4 vec4) + { + return 0; + } + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/UnityEngine.TestRunner/Utils/Vector4EqualityComparer.cs.meta new file mode 100644 index 00000000..149157d1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/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/clock/Library/PackageCache/com.unity.test-framework@1.1.22/package.json b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/package.json new file mode 100644 index 00000000..ef0f2bf1 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/package.json @@ -0,0 +1,29 @@ +{ + "name": "com.unity.test-framework", + "displayName": "Test Framework", + "version": "1.1.22", + "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": "56c667cbc326a1cbab8dfd7ebc693a1121d0abe1" + }, + "dependencies": { + "com.unity.ext.nunit": "1.0.6", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "relatedPackages": { + "com.unity.test-framework.tests": "1.1.22" + }, + "upmCi": { + "footprint": "a7696c2774acb6a55c4245379d06b2ebf69c555c" + } +} diff --git a/clock/Library/PackageCache/com.unity.test-framework@1.1.22/package.json.meta b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/package.json.meta new file mode 100644 index 00000000..63170c30 --- /dev/null +++ b/clock/Library/PackageCache/com.unity.test-framework@1.1.22/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d6a2e6e4803de7b43baacdc355fc144d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md new file mode 100644 index 00000000..594a0e22 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/CHANGELOG.md.meta new file mode 100644 index 00000000..edf5c327 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md new file mode 100644 index 00000000..8f8c0926 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Documentation~/TextMeshPro.md.meta new file mode 100644 index 00000000..8c72f725 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources.meta new file mode 100644 index 00000000..7c07b007 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos.meta new file mode 100644 index 00000000..f2596c78 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd new file mode 100644 index 00000000..93f5a2cb Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Dropdown Icon.psd.meta new file mode 100644 index 00000000..7bdb473e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd new file mode 100644 index 00000000..2fb1164d Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Font Asset Icon.psd.meta new file mode 100644 index 00000000..bd64ad7d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd new file mode 100644 index 00000000..f0360d34 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Input Field Icon.psd.meta new file mode 100644 index 00000000..eb2e1ce2 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd new file mode 100644 index 00000000..7036296e Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Sprite Asset Icon.psd.meta new file mode 100644 index 00000000..a22cdf1c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd new file mode 100644 index 00000000..3cc41630 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta new file mode 100644 index 00000000..623993d2 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders.meta new file mode 100644 index 00000000..95efe2ba --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc new file mode 100644 index 00000000..2e962588 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_Properties.cginc.meta new file mode 100644 index 00000000..e6dcc0a0 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader new file mode 100644 index 00000000..baf4501c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF Internal Editor.shader.meta new file mode 100644 index 00000000..5ba708d8 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc new file mode 100644 index 00000000..0f587bd4 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Shaders/TMP_SDF_SSD.cginc.meta new file mode 100644 index 00000000..3d0b3bf4 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures.meta new file mode 100644 index 00000000..d6754b05 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd new file mode 100644 index 00000000..8ebaa27a Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Dark.psd.meta new file mode 100644 index 00000000..ed7250a7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd new file mode 100644 index 00000000..e598e6d9 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/SectionHeader_Light.psd.meta new file mode 100644 index 00000000..1e747b22 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd new file mode 100644 index 00000000..3da358a1 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine.psd.meta new file mode 100644 index 00000000..09deb3c8 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd new file mode 100644 index 00000000..cf49b6cb Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBaseLine_Light.psd.meta new file mode 100644 index 00000000..78e14cba --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd new file mode 100644 index 00000000..1f35779e Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom.psd.meta new file mode 100644 index 00000000..8e79b489 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd new file mode 100644 index 00000000..d8af55bd Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignBottom_Light.psd.meta new file mode 100644 index 00000000..9c9a6fc0 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd new file mode 100644 index 00000000..7eefe6b2 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine.psd.meta new file mode 100644 index 00000000..0455a2fc --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd new file mode 100644 index 00000000..f08bb6ce Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCapLine_Light.psd.meta new file mode 100644 index 00000000..dfd05a11 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd new file mode 100644 index 00000000..939bc6dc Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter.psd.meta new file mode 100644 index 00000000..d189fc27 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd new file mode 100644 index 00000000..f9ce9a8b Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo.psd.meta new file mode 100644 index 00000000..555bb1bb --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd new file mode 100644 index 00000000..e37b2e25 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenterGeo_Light.psd.meta new file mode 100644 index 00000000..044d0c21 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd new file mode 100644 index 00000000..7274887f Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignCenter_Light.psd.meta new file mode 100644 index 00000000..d98d3772 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd new file mode 100644 index 00000000..eeeea67b Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush.psd.meta new file mode 100644 index 00000000..84ed28c0 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd new file mode 100644 index 00000000..b69f6a2e Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignFlush_Light.psd.meta new file mode 100644 index 00000000..b9e61247 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd new file mode 100644 index 00000000..3ce55c49 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified.psd.meta new file mode 100644 index 00000000..f8a90b42 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd new file mode 100644 index 00000000..d7fd5c82 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignJustified_Light.psd.meta new file mode 100644 index 00000000..e5b5aa85 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd new file mode 100644 index 00000000..fc7e10b2 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft.psd.meta new file mode 100644 index 00000000..8023379e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd new file mode 100644 index 00000000..5522c373 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignLeft_Light.psd.meta new file mode 100644 index 00000000..aaa8b81d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd new file mode 100644 index 00000000..14d28a2d Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidLine.psd.meta new file mode 100644 index 00000000..e481463b --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd new file mode 100644 index 00000000..c4483dbd Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle.psd.meta new file mode 100644 index 00000000..d1ec5285 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd new file mode 100644 index 00000000..4263bf9b Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMiddle_Light.psd.meta new file mode 100644 index 00000000..7cda20b7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd new file mode 100644 index 00000000..a5bed371 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignMidline_Light.psd.meta new file mode 100644 index 00000000..6fabec54 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd new file mode 100644 index 00000000..4ef1998b Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight.psd.meta new file mode 100644 index 00000000..cf5c7649 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd new file mode 100644 index 00000000..bdeff413 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignRight_Light.psd.meta new file mode 100644 index 00000000..dab7997c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd new file mode 100644 index 00000000..b00d4585 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop.psd.meta new file mode 100644 index 00000000..74931bf8 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd new file mode 100644 index 00000000..84f0e61c Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Editor Resources/Textures/btn_AlignTop_Light.psd.meta new file mode 100644 index 00000000..bbd509d1 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md new file mode 100644 index 00000000..37d06155 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/LICENSE.md.meta new file mode 100644 index 00000000..1df95556 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources.meta new file mode 100644 index 00000000..e8a96b82 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage new file mode 100644 index 00000000..aa27eb5b Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Essential Resources.unitypackage.meta new file mode 100644 index 00000000..bc49ab30 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage new file mode 100644 index 00000000..ea3a62b9 Binary files /dev/null and b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage differ diff --git a/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Package Resources/TMP Examples & Extras.unitypackage.meta new file mode 100644 index 00000000..aaf21f78 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json new file mode 100644 index 00000000..05c193e2 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData.json.meta new file mode 100644 index 00000000..a7a2790c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json new file mode 100644 index 00000000..f07aa23f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/PackageConversionData_Assets.json.meta new file mode 100644 index 00000000..f534ac14 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts.meta new file mode 100644 index 00000000..3c2e4cf7 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor.meta new file mode 100644 index 00000000..af509a3a --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs new file mode 100644 index 00000000..2b7dc854 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/DropdownOptionListDrawer.cs.meta new file mode 100644 index 00000000..f7f4c565 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs new file mode 100644 index 00000000..0936dc75 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphInfoDrawer.cs.meta new file mode 100644 index 00000000..10ed151e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs new file mode 100644 index 00000000..bcd25a61 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphMetricsPropertyDrawer.cs.meta new file mode 100644 index 00000000..d91f5791 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs new file mode 100644 index 00000000..c9be74e9 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/GlyphRectPropertyDrawer.cs.meta new file mode 100644 index 00000000..93232794 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs new file mode 100644 index 00000000..5896c336 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseEditorPanel.cs.meta new file mode 100644 index 00000000..87bd7391 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs new file mode 100644 index 00000000..5fd33ce5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BaseShaderGUI.cs.meta new file mode 100644 index 00000000..f07bd856 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs new file mode 100644 index 00000000..be399599 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_BitmapShaderGUI.cs.meta new file mode 100644 index 00000000..6d0e0529 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs new file mode 100644 index 00000000..98f32c7a --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_CharacterPropertyDrawer.cs.meta new file mode 100644 index 00000000..3bf78921 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs new file mode 100644 index 00000000..d7ca885d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientAssetMenu.cs.meta new file mode 100644 index 00000000..a2201ee6 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs new file mode 100644 index 00000000..ca79435f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ColorGradientEditor.cs.meta new file mode 100644 index 00000000..dc58116c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs new file mode 100644 index 00000000..48f8e2b4 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_DropdownEditor.cs.meta new file mode 100644 index 00000000..75030cfd --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs new file mode 100644 index 00000000..e0056039 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorCoroutine.cs.meta new file mode 100644 index 00000000..16e03fa8 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs new file mode 100644 index 00000000..a03494f0 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanel.cs.meta new file mode 100644 index 00000000..54fd8048 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs new file mode 100644 index 00000000..c5085463 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorPanelUI.cs.meta new file mode 100644 index 00000000..ea3b36b3 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs new file mode 100644 index 00000000..8869dd3e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_EditorUtility.cs.meta new file mode 100644 index 00000000..5088b1bd --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs new file mode 100644 index 00000000..8cf9a79d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAssetEditor.cs.meta new file mode 100644 index 00000000..9b26bae5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs new file mode 100644 index 00000000..344965cc --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_FontAsset_CreationMenu.cs.meta new file mode 100644 index 00000000..57a3fcea --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs new file mode 100644 index 00000000..69ac6f89 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPairAdjustmentRecordPropertyDrawer.cs.meta new file mode 100644 index 00000000..b95203f5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs new file mode 100644 index 00000000..d8d37004 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_GlyphPropertyDrawer.cs.meta new file mode 100644 index 00000000..ce08447f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs new file mode 100644 index 00000000..ec481d77 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_InputFieldEditor.cs.meta new file mode 100644 index 00000000..eeb62d8c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs new file mode 100644 index 00000000..83d19f8c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_MeshRendererEditor.cs.meta new file mode 100644 index 00000000..d6b133fd --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs new file mode 100644 index 00000000..92881118 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PackageUtilities.cs.meta new file mode 100644 index 00000000..e03778cc --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs new file mode 100644 index 00000000..a8b800ac --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_PostBuildProcessHandler.cs.meta new file mode 100644 index 00000000..af212b86 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs new file mode 100644 index 00000000..b8695be2 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ProjectTextSettings.cs.meta new file mode 100644 index 00000000..6d194543 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs new file mode 100644 index 00000000..090bd774 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_ResourcesLoader.cs.meta new file mode 100644 index 00000000..8b322e2f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs new file mode 100644 index 00000000..220bac22 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SDFShaderGUI.cs.meta new file mode 100644 index 00000000..c643afa1 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs new file mode 100644 index 00000000..2ba34d69 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SerializedPropertyHolder.cs.meta new file mode 100644 index 00000000..cde31db9 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs new file mode 100644 index 00000000..f8c601eb --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SettingsEditor.cs.meta new file mode 100644 index 00000000..a719ae77 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs new file mode 100644 index 00000000..e7d48d1b --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetEditor.cs.meta new file mode 100644 index 00000000..9fcede33 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs new file mode 100644 index 00000000..89be4adf --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetImporter.cs.meta new file mode 100644 index 00000000..d60763a5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs new file mode 100644 index 00000000..344150b1 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteAssetMenu.cs.meta new file mode 100644 index 00000000..850ab1f2 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs new file mode 100644 index 00000000..bc501618 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteCharacterPropertyDrawer.cs.meta new file mode 100644 index 00000000..0733749d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs new file mode 100644 index 00000000..cf79bc82 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SpriteGlyphPropertyDrawer.cs.meta new file mode 100644 index 00000000..04145626 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs new file mode 100644 index 00000000..480a7767 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleAssetMenu.cs.meta new file mode 100644 index 00000000..cb44dc27 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs new file mode 100644 index 00000000..2968c29c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_StyleSheetEditor.cs.meta new file mode 100644 index 00000000..a3bff26f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs new file mode 100644 index 00000000..679f4458 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMeshUI_Editor.cs.meta new file mode 100644 index 00000000..b82410e5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs new file mode 100644 index 00000000..f668af96 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_SubMesh_Editor.cs.meta new file mode 100644 index 00000000..fd4713b3 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs new file mode 100644 index 00000000..1361de73 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_TextAlignmentDrawer.cs.meta new file mode 100644 index 00000000..a68a2739 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs new file mode 100644 index 00000000..0a94a997 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMP_UIStyleManager.cs.meta new file mode 100644 index 00000000..9c09bfa3 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs new file mode 100644 index 00000000..a01760da --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_ContextMenus.cs.meta new file mode 100644 index 00000000..f16753fe --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs new file mode 100644 index 00000000..99b83a66 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_CreateObjectMenu.cs.meta new file mode 100644 index 00000000..be9643fd --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs new file mode 100644 index 00000000..3d639005 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_EditorShaderUtilities.cs.meta new file mode 100644 index 00000000..89d25943 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs new file mode 100644 index 00000000..4d895a52 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontAssetCreatorWindow.cs.meta new file mode 100644 index 00000000..4648857f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs new file mode 100644 index 00000000..3b098ff2 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_FontPlugin.cs.meta new file mode 100644 index 00000000..66f3a87e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs new file mode 100644 index 00000000..c36f9f8c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_SortingLayerHelper.cs.meta new file mode 100644 index 00000000..9d902b90 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs new file mode 100644 index 00000000..09fc6173 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TextContainerEditor.cs.meta new file mode 100644 index 00000000..bad78812 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs new file mode 100644 index 00000000..b822d47d --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/TMPro_TexturePostProcessor.cs.meta new file mode 100644 index 00000000..fb00b80f --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef new file mode 100644 index 00000000..437e2215 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Editor/Unity.TextMeshPro.Editor.asmdef.meta new file mode 100644 index 00000000..6ed76ad6 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime.meta new file mode 100644 index 00000000..4b244150 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs new file mode 100644 index 00000000..52784935 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/AssemblyInfo.cs.meta new file mode 100644 index 00000000..cd527067 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs new file mode 100644 index 00000000..62b378d8 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/FastAction.cs.meta new file mode 100644 index 00000000..fcd991e5 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs new file mode 100644 index 00000000..5d3f57a2 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/ITextPreProcessor.cs.meta new file mode 100644 index 00000000..8dd70834 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs new file mode 100644 index 00000000..c1e05e98 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/MaterialReferenceManager.cs.meta new file mode 100644 index 00000000..17ad5664 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs new file mode 100644 index 00000000..60ed878b --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Asset.cs.meta new file mode 100644 index 00000000..62e9ee7a --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs new file mode 100644 index 00000000..6b4cc834 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Character.cs.meta new file mode 100644 index 00000000..55aea1b6 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs new file mode 100644 index 00000000..2a919f6c --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CharacterInfo.cs.meta new file mode 100644 index 00000000..9367a16e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs new file mode 100644 index 00000000..8e8e38a8 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_ColorGradient.cs.meta new file mode 100644 index 00000000..1d79d010 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs new file mode 100644 index 00000000..8484a5c3 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_Compatibility.cs.meta new file mode 100644 index 00000000..e0c9caba --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs new file mode 100644 index 00000000..bec1f54e --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs.meta b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_CoroutineTween.cs.meta new file mode 100644 index 00000000..01cf5eb3 --- /dev/null +++ b/clock/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/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_DefaultControls.cs b/clock/Library/PackageCache/com.unity.textmeshpro@2.1.1/Scripts/Runtime/TMP_DefaultControls.cs new file mode 100644 index 00000000..45eac333 --- /dev/null +++ b/clock/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