Repository: NVentimiglia/Foundation-Light Branch: master Commit: a01cef250ca5 Files: 229 Total size: 647.2 KB Directory structure: gitextract_j7tilph7/ ├── .gitignore ├── DomainEvents.md ├── Foundation.Architecture/ │ ├── .vs/ │ │ └── restore.dg │ ├── Architecture/ │ │ ├── Architecture.Unity3d.csproj │ │ ├── Architecture.Unity3d.csproj.DotSettings │ │ ├── Architecture.WebGL.csproj │ │ ├── Architecture.csproj │ │ ├── Architecture.csproj.DotSettings │ │ ├── Data/ │ │ │ ├── BufferExt.cs │ │ │ ├── BufferHelper.cs │ │ │ └── JsonHelper.cs │ │ ├── Injector/ │ │ │ ├── InjectAttribute.cs │ │ │ └── InjectService.cs │ │ ├── Logging/ │ │ │ ├── LogModel.cs │ │ │ ├── LogService.Unity3d.cs │ │ │ └── LogService.cs │ │ ├── Messaging/ │ │ │ ├── DomainEvents.cs │ │ │ └── ObjectEvents.cs │ │ ├── Observables/ │ │ │ ├── IObservable.cs │ │ │ ├── ListEvent.cs │ │ │ ├── ObservableBehaviour.cs │ │ │ ├── ObservableList.cs │ │ │ ├── ObservableObject.cs │ │ │ ├── ObservableProperty.cs │ │ │ ├── ObservableProxy.cs │ │ │ ├── PropertyEvent.cs │ │ │ └── ReflectionExt.cs │ │ ├── Pooling/ │ │ │ ├── Pool.cs │ │ │ └── ThreadSafePool.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── Threading/ │ │ │ ├── AsyncLock.cs │ │ │ ├── AsyncSemaphore.cs │ │ │ ├── Internal/ │ │ │ │ ├── AsyncThreadService.cs │ │ │ │ ├── IThreadingService.cs │ │ │ │ └── UnityThreadService.cs │ │ │ ├── RoutineTimer.cs │ │ │ └── ThreadingService.cs │ │ └── packages.config │ ├── Architecture.Core/ │ │ ├── Architecture.Core.xproj │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── project.json │ │ └── project.lock.json │ ├── Architecture.Core.sln │ ├── Architecture.sln │ └── Tests/ │ ├── Architecture.Tests.csproj │ ├── BufferHelperTests.cs │ ├── DomainEventsTest.cs │ ├── InjectorTests.cs │ ├── ObjectEventsTest.cs │ ├── ObservableTests.cs │ ├── Properties/ │ │ └── AssemblyInfo.cs │ ├── SerializerTests.cs │ ├── TestModels.cs │ ├── ThreadingTests.cs │ └── packages.config ├── Foundation.Unity/ │ ├── Assets/ │ │ ├── Binding/ │ │ │ ├── BindingComponenet.cs │ │ │ ├── BindingComponenet.cs.meta │ │ │ ├── IViewTarget.cs │ │ │ ├── IViewTarget.cs.meta │ │ │ ├── View.cs │ │ │ └── View.cs.meta │ │ ├── Binding.meta │ │ ├── Plugins/ │ │ │ ├── Foundation.Architecture.Unity3d.dll.mdb │ │ │ ├── Foundation.Architecture.Unity3d.dll.mdb.meta │ │ │ ├── Foundation.Architecture.Unity3d.dll.meta │ │ │ ├── Foundation.Architecture.Unity3d.pdb.meta │ │ │ └── Foundation.Architecture.WebGL.dll.meta │ │ ├── Plugins.meta │ │ ├── Tests/ │ │ │ ├── Assert.cs │ │ │ ├── Assert.cs.meta │ │ │ ├── BufferHelperTests.cs │ │ │ ├── BufferHelperTests.cs.meta │ │ │ ├── DemoTest.cs │ │ │ ├── DemoTest.cs.meta │ │ │ ├── DomainEventsTest.cs │ │ │ ├── DomainEventsTest.cs.meta │ │ │ ├── InjectorTests.cs │ │ │ ├── InjectorTests.cs.meta │ │ │ ├── ObjectEventsTest.cs │ │ │ ├── ObjectEventsTest.cs.meta │ │ │ ├── ObservableTests.cs │ │ │ ├── ObservableTests.cs.meta │ │ │ ├── TestMethod.cs │ │ │ ├── TestMethod.cs.meta │ │ │ ├── TestScene.unity │ │ │ ├── TestScene.unity.meta │ │ │ ├── ThreadingTests.cs │ │ │ └── ThreadingTests.cs.meta │ │ ├── Tests.meta │ │ ├── UnityTestTools/ │ │ │ ├── Assertions.meta │ │ │ ├── Common/ │ │ │ │ ├── Editor/ │ │ │ │ │ ├── Icons.cs │ │ │ │ │ ├── Icons.cs.meta │ │ │ │ │ ├── ProjectSettingsBase.cs │ │ │ │ │ ├── ProjectSettingsBase.cs.meta │ │ │ │ │ ├── ResultWriter/ │ │ │ │ │ │ ├── ResultSummarizer.cs │ │ │ │ │ │ ├── ResultSummarizer.cs.meta │ │ │ │ │ │ ├── StackTraceFilter.cs │ │ │ │ │ │ ├── StackTraceFilter.cs.meta │ │ │ │ │ │ ├── XmlResultWriter.cs │ │ │ │ │ │ └── XmlResultWriter.cs.meta │ │ │ │ │ ├── ResultWriter.meta │ │ │ │ │ ├── Styles.cs │ │ │ │ │ ├── Styles.cs.meta │ │ │ │ │ ├── TestFilterSettings.cs │ │ │ │ │ ├── TestFilterSettings.cs.meta │ │ │ │ │ ├── icons/ │ │ │ │ │ │ ├── failed.png.meta │ │ │ │ │ │ ├── ignored.png.meta │ │ │ │ │ │ ├── inconclusive.png.meta │ │ │ │ │ │ ├── normal.png.meta │ │ │ │ │ │ ├── passed.png.meta │ │ │ │ │ │ └── stopwatch.png.meta │ │ │ │ │ └── icons.meta │ │ │ │ ├── Editor.meta │ │ │ │ ├── ITestResult.cs │ │ │ │ ├── ITestResult.cs.meta │ │ │ │ ├── Settings/ │ │ │ │ │ ├── IntegrationTestsRunnerSettings.asset │ │ │ │ │ └── IntegrationTestsRunnerSettings.asset.meta │ │ │ │ ├── Settings.meta │ │ │ │ ├── TestResultState.cs │ │ │ │ └── TestResultState.cs.meta │ │ │ ├── Common.meta │ │ │ ├── Documentation.url │ │ │ ├── Documentation.url.meta │ │ │ ├── IntegrationTestsFramework/ │ │ │ │ ├── Libs/ │ │ │ │ │ ├── Mono.Cecil.Mdb.dll.meta │ │ │ │ │ └── Mono.Cecil.dll.meta │ │ │ │ ├── Libs.meta │ │ │ │ ├── TestRunner/ │ │ │ │ │ ├── DTOFormatter.cs │ │ │ │ │ ├── DTOFormatter.cs.meta │ │ │ │ │ ├── Editor/ │ │ │ │ │ │ ├── Batch.cs │ │ │ │ │ │ ├── Batch.cs.meta │ │ │ │ │ │ ├── EditorReferencesUtil.cs │ │ │ │ │ │ ├── EditorReferencesUtil.cs.meta │ │ │ │ │ │ ├── GuiHelper.cs │ │ │ │ │ │ ├── GuiHelper.cs.meta │ │ │ │ │ │ ├── IntegrationTestsHierarchyAnnotation.cs │ │ │ │ │ │ ├── IntegrationTestsHierarchyAnnotation.cs.meta │ │ │ │ │ │ ├── IntegrationTestsRunnerSettings.cs │ │ │ │ │ │ ├── IntegrationTestsRunnerSettings.cs.meta │ │ │ │ │ │ ├── IntegrationTestsRunnerWindow.cs │ │ │ │ │ │ ├── IntegrationTestsRunnerWindow.cs.meta │ │ │ │ │ │ ├── PlatformRunner/ │ │ │ │ │ │ │ ├── NetworkResultsReceiver.cs │ │ │ │ │ │ │ ├── NetworkResultsReceiver.cs.meta │ │ │ │ │ │ │ ├── PlatformRunner.cs │ │ │ │ │ │ │ ├── PlatformRunner.cs.meta │ │ │ │ │ │ │ ├── PlatformRunnerConfiguration.cs │ │ │ │ │ │ │ ├── PlatformRunnerConfiguration.cs.meta │ │ │ │ │ │ │ ├── PlatformRunnerSettings.cs │ │ │ │ │ │ │ ├── PlatformRunnerSettings.cs.meta │ │ │ │ │ │ │ ├── PlatformRunnerSettingsWindow.cs │ │ │ │ │ │ │ ├── PlatformRunnerSettingsWindow.cs.meta │ │ │ │ │ │ │ ├── PlayerSettingConfigurator.cs │ │ │ │ │ │ │ └── PlayerSettingConfigurator.cs.meta │ │ │ │ │ │ ├── PlatformRunner.meta │ │ │ │ │ │ ├── Renderer/ │ │ │ │ │ │ │ ├── IntegrationTestGroupLine.cs │ │ │ │ │ │ │ ├── IntegrationTestGroupLine.cs.meta │ │ │ │ │ │ │ ├── IntegrationTestLine.cs │ │ │ │ │ │ │ ├── IntegrationTestLine.cs.meta │ │ │ │ │ │ │ ├── IntegrationTestRendererBase.cs │ │ │ │ │ │ │ ├── IntegrationTestRendererBase.cs.meta │ │ │ │ │ │ │ ├── RenderingOptions.cs │ │ │ │ │ │ │ └── RenderingOptions.cs.meta │ │ │ │ │ │ ├── Renderer.meta │ │ │ │ │ │ ├── TestComponentEditor.cs │ │ │ │ │ │ └── TestComponentEditor.cs.meta │ │ │ │ │ ├── Editor.meta │ │ │ │ │ ├── ITestRunnerCallback.cs │ │ │ │ │ ├── ITestRunnerCallback.cs.meta │ │ │ │ │ ├── IntegrationTest.cs │ │ │ │ │ ├── IntegrationTest.cs.meta │ │ │ │ │ ├── IntegrationTestAttribute.cs │ │ │ │ │ ├── IntegrationTestAttribute.cs.meta │ │ │ │ │ ├── IntegrationTestsProvider.cs │ │ │ │ │ ├── IntegrationTestsProvider.cs.meta │ │ │ │ │ ├── NetworkResultSender.cs │ │ │ │ │ ├── NetworkResultSender.cs.meta │ │ │ │ │ ├── ResultDTO.cs │ │ │ │ │ ├── ResultDTO.cs.meta │ │ │ │ │ ├── TestComponent.cs │ │ │ │ │ ├── TestComponent.cs.meta │ │ │ │ │ ├── TestResult.cs │ │ │ │ │ ├── TestResult.cs.meta │ │ │ │ │ ├── TestResultRenderer.cs │ │ │ │ │ ├── TestResultRenderer.cs.meta │ │ │ │ │ ├── TestRunner.cs │ │ │ │ │ ├── TestRunner.cs.meta │ │ │ │ │ ├── TestRunnerCallbackList.cs │ │ │ │ │ ├── TestRunnerCallbackList.cs.meta │ │ │ │ │ ├── TestRunnerConfigurator.cs │ │ │ │ │ └── TestRunnerConfigurator.cs.meta │ │ │ │ ├── TestRunner.meta │ │ │ │ ├── TestingAssets/ │ │ │ │ │ ├── CallTesting.cs │ │ │ │ │ ├── CallTesting.cs.meta │ │ │ │ │ ├── CubeCollisionFailure.prefab │ │ │ │ │ ├── CubeCollisionFailure.prefab.meta │ │ │ │ │ ├── CubeCollisionSuccess.prefab │ │ │ │ │ ├── CubeCollisionSuccess.prefab.meta │ │ │ │ │ ├── CubeTriggerFailure.prefab │ │ │ │ │ ├── CubeTriggerFailure.prefab.meta │ │ │ │ │ ├── CubeTriggerSuccess.prefab │ │ │ │ │ ├── CubeTriggerSuccess.prefab.meta │ │ │ │ │ ├── Materials/ │ │ │ │ │ │ ├── green.mat │ │ │ │ │ │ ├── green.mat.meta │ │ │ │ │ │ ├── red.mat │ │ │ │ │ │ └── red.mat.meta │ │ │ │ │ ├── Materials.meta │ │ │ │ │ ├── green.png.meta │ │ │ │ │ └── red.png.meta │ │ │ │ └── TestingAssets.meta │ │ │ ├── IntegrationTestsFramework.meta │ │ │ ├── LICENSE.txt │ │ │ ├── LICENSE.txt.meta │ │ │ ├── UnitTesting/ │ │ │ │ ├── Editor/ │ │ │ │ │ ├── NSubstitute/ │ │ │ │ │ │ └── NSubstitute.dll.meta │ │ │ │ │ └── NSubstitute.meta │ │ │ │ └── Editor.meta │ │ │ ├── UnitTesting.meta │ │ │ ├── changelog.txt │ │ │ └── changelog.txt.meta │ │ └── UnityTestTools.meta │ ├── Foundation.Unity.CSharp.Editor.csproj │ ├── Foundation.Unity.CSharp.Plugins.csproj │ ├── Foundation.Unity.CSharp.csproj │ └── Foundation.Unity.sln ├── Injector.md ├── LICENSE.md ├── Logging.md ├── ObjectEvents.md ├── Observable.md ├── README.md └── Threading.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ *.suo *.user _ReSharper.* bin obj packages/ # TODO NUGET !/packages/UnityEngine.dll !/packages/UnityEngine.dll.mdb !/packages/UnityEngine.xml Foundation.Architecture/TestResults/ Foundation.Unity/Library/ Foundation.Unity/Temp/ Foundation.Unity/Assets/UnityTestTools/Assertions/ Foundation.Unity/ProjectSettings/ ================================================ FILE: DomainEvents.md ================================================ # Domain Events A global message broker for relaying events routed by the objects type. This pub sub service is perfect for decoupling logical consumers from infrastructure. This implementation makes use of static generics. This alows us to not use reflection. On IOS and other older AOT platforms this can cause error of 'not enough trampolines', which can be fixed by config setting. ## Use ````` //Define a message class to send var msg = new Msg {Content = MagicString}; //subscribe you handlers DomainEvents.Subscribe(Handler); //maby ways to send DomainEvents.Publish(msg); DomainEvents.Publish(msg); DomainEvents.Publish(msg, typeof(Msg)); //unsubcribe when done as we are not using weakreferences internally DomainEvents.Unsubscribe(Handler); public void Handler(Msg myMessage) { //Do Something } ````` ================================================ FILE: Foundation.Architecture/.vs/restore.dg ================================================ #:C:\Users\nick\Documents\Nventi\Foundation-Light\Foundation.Architecture\Architecture.Core.Tests\Architecture.Core.Tests.xproj C:\Users\nick\Documents\Nventi\Foundation-Light\Foundation.Architecture\Architecture.Core.Tests\Architecture.Core.Tests.xproj|C:\Users\nick\Documents\Nventi\Foundation-Light\Foundation.Architecture\Architecture.Core\Architecture.Core.xproj ================================================ FILE: Foundation.Architecture/Architecture/Architecture.Unity3d.csproj ================================================  Debug AnyCPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F} Library Properties Foundation.Architecture Foundation.Architecture.Unity3d v3.5 512 Unity Subset v3.5 true full false bin\Debug\ TRACE;DEBUG;UNITY;USE_THREAD prompt 4 true pdbonly true bin\Release\ TRACE prompt 4 ..\..\packages\UnityEngine.dll echo f | xcopy "$(TargetDir)Foundation.Architecture.Unity3d.dll" "$(SolutionDir)..\Foundation.Unity\Assets\Plugins\Foundation.Architecture.Unity3d.dll" /D /Y echo f | xcopy "$(TargetDir)Foundation.Architecture.Unity3d.pdb" "$(SolutionDir)..\Foundation.Unity\Assets\Plugins\Foundation.Architecture.Unity3d.pdb" /D /Y ================================================ FILE: Foundation.Architecture/Architecture/Architecture.Unity3d.csproj.DotSettings ================================================  True True True True True True True ================================================ FILE: Foundation.Architecture/Architecture/Architecture.WebGL.csproj ================================================  Debug AnyCPU {7238EC8C-9378-4369-BEA9-07D774F6C104} Library Properties Foundation.Architecture Foundation.Architecture.WebGL v3.5 512 Unity Subset v3.5 true full false bin\Debug\ TRACE;DEBUG;UNITY prompt 4 true pdbonly true bin\Release\ TRACE prompt 4 ..\..\packages\UnityEngine.dll echo f | xcopy "$(TargetDir)Foundation.Architecture.WebGL.dll" "$(SolutionDir)..\Foundation.Unity\Assets\Plugins\Foundation.Architecture.WebGL.dll" /D /Y ================================================ FILE: Foundation.Architecture/Architecture/Architecture.csproj ================================================  Debug AnyCPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB} Library Properties Foundation.Architecture Foundation.Architecture v4.5.2 512 true full false bin\Debug\ DEBUG;TRACE prompt 4 true pdbonly true bin\Release\ TRACE prompt 4 ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True ================================================ FILE: Foundation.Architecture/Architecture/Architecture.csproj.DotSettings ================================================  True True True True True True True True ================================================ FILE: Foundation.Architecture/Architecture/Data/BufferExt.cs ================================================ // Nicholas Ventimiglia 2016-09-05 namespace Foundation.Architecture { public static class BufferExt { /// /// For Human Readability /// /// /// public static double ConvertBytesToMegabytes(long bytes) { return (bytes/1024f)/1024f; } /// /// For Human Readability /// /// /// public static double ConvertKilobytesToMegabytes(long kilobytes) { return kilobytes/1024f; } } } ================================================ FILE: Foundation.Architecture/Architecture/Data/BufferHelper.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; using System.Text; namespace Foundation.Architecture { /// /// Unsafe I/O for byte arrays /// /// /// Here incase we need it. May not, depends on how we pool things. /// public static class BufferHelper { #region Read public static unsafe bool ReadBool(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(bool)); bool result; fixed (byte* ptr = buffer) { result = *(bool*) (ptr + index); } return result; } public static unsafe byte ReadByte(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(byte)); byte result; fixed (byte* ptr = buffer) { result = *(byte*) (ptr + index); } return result; } public static unsafe short ReadInt16(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(short)); short result; fixed (byte* ptr = buffer) { result = *(short*) (ptr + index); } return result; } public static unsafe ushort ReadUInt16(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(ushort)); ushort result; fixed (byte* ptr = buffer) { result = *(ushort*) (ptr + index); } return result; } public static unsafe int ReadInt32(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(int)); int result; fixed (byte* ptr = buffer) { result = *(int*) (ptr + index); } return result; } public static unsafe uint ReadUInt32(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(uint)); uint result; fixed (byte* ptr = buffer) { result = *(uint*) (ptr + index); } return result; } public static unsafe long ReadInt64(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(long)); long result; fixed (byte* ptr = buffer) { result = *(long*) (ptr + index); } return result; } public static unsafe ulong ReadUInt64(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(ulong)); ulong result; fixed (byte* ptr = buffer) { result = *(ulong*) (ptr + index); } return result; } public static unsafe double ReadDouble(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(double)); double result; fixed (byte* ptr = buffer) { result = *(double*) (ptr + index); } return result; } public static unsafe float ReadFloat(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(float)); float result; fixed (byte* ptr = buffer) { result = *(float*) (ptr + index); } return result; } public static unsafe char ReadChar(byte[] buffer, int index) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(char)); char result; fixed (byte* ptr = buffer) { result = *(char*) (ptr + index); } return result; } public static string ReadString(byte[] buffer, int index) { //http://stackoverflow.com/questions/10773440/conversion-in-net-native-utf-8-managed-string var length = ReadUInt16(buffer, index); var result = Encoding.UTF8.GetString(buffer, index + sizeof(ushort), length); return result; } #endregion #region Write public static void Write(byte[] buffer, int index, byte[] payload, int count) { Ensures(buffer != null); Ensures(buffer.Length >= index + count); Buffer.BlockCopy(payload, 0, buffer, index, count); } public static void Write(byte[] buffer, int index, byte b) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(byte)); buffer[index] = b; } public static unsafe void Write(byte[] buffer, int index, bool value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(bool)); fixed (byte* ptr = buffer) { *(bool*) (ptr + index) = value; } } public static unsafe void Write(byte[] buffer, int index, short value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(short)); fixed (byte* ptr = buffer) { *(short*) (ptr + index) = value; } } public static unsafe void Write(byte[] buffer, int index, ushort value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(ushort)); fixed (byte* ptr = buffer) { *(ushort*) (ptr + index) = value; } } public static unsafe void Write(byte[] buffer, int index, int value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(int)); fixed (byte* ptr = buffer) { *(int*) (ptr + index) = value; } } public static unsafe void Write(byte[] buffer, int index, uint value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(uint)); fixed (byte* ptr = buffer) { *(uint*) (ptr + index) = value; } } public static unsafe void Write(byte[] buffer, int index, double value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(double)); fixed (byte* ptr = buffer) { *(double*) (ptr + index) = value; } } public static unsafe void Write(byte[] buffer, int index, long value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(long)); fixed (byte* ptr = buffer) { *(long*) (ptr + index) = value; } } public static unsafe void Write(byte[] buffer, int index, ulong value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(ulong)); fixed (byte* ptr = buffer) { *(ulong*) (ptr + index) = value; } } public static unsafe void Write(byte[] buffer, int index, float value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(float)); fixed (byte* ptr = buffer) { *(float*) (ptr + index) = value; } } public static unsafe void Write(byte[] buffer, int index, char value) { Ensures(buffer != null); Ensures(buffer.Length >= index + sizeof(char)); fixed (byte* ptr = buffer) { *(char*) (ptr + index) = value; } } public static void Write(byte[] buffer, int index, string value) { Ensures(buffer != null); var payload = Encoding.UTF8.GetBytes(value); Write(buffer, index, (ushort) payload.Length); Write(buffer, index + sizeof(ushort), payload, payload.Length); } #endregion #region Private public static void Ensures(bool assertion) { if(!assertion) throw new ArgumentException("BufferHelper : Method failed sanity."); } #endregion } } ================================================ FILE: Foundation.Architecture/Architecture/Data/JsonHelper.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; #if !UNITY using Newtonsoft.Json; #endif namespace Foundation.Architecture { /// /// Json serialization proxy. Platform agnostic. /// public class JsonHelper { #if !UNITY public static T FromJson(string json) { return JsonConvert.DeserializeObject(json); } public static object FromJson(string json, Type type) { return JsonConvert.DeserializeObject(json, type); } public static string ToJson(object instance) { return JsonConvert.SerializeObject(instance); } #else public static T FromJson(string json) { return UnityEngine.JsonUtility.FromJson(json); } public static object FromJson(string json, Type type) { return UnityEngine.JsonUtility.FromJson(json, type); } public static string ToJson(object instance) { return UnityEngine.JsonUtility.ToJson(instance); } #endif } } ================================================ FILE: Foundation.Architecture/Architecture/Injector/InjectAttribute.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; namespace Foundation.Architecture { /// /// Identifies a service to be injected /// /// /// Use Inject into /// [AttributeUsage(AttributeTargets.Field)] public class InjectAttribute : Attribute { } } ================================================ FILE: Foundation.Architecture/Architecture/Injector/InjectService.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace Foundation.Architecture { /// /// Default Inject Service /// public class InjectService { // RegisterTransient /// /// Registers a new service. Transient is a new instance per get. /// public static void RegisterTransient() where TInstance : class, new() { Container.Add(typeof(TInterface), new InjectReference(DefaultFactory())); } /// /// Registers a new service. Transient is a new instance per get. /// public static void RegisterTransient() where TInstance : class, new() { Container.Add(typeof(TInstance), new InjectReference(DefaultFactory())); } /// /// Registers a new service. Transient is a new instance per get. /// public static void RegisterTransient(Func factory) where TInstance : class { Container.Add(typeof(TInterface), new InjectReference(DefaultFactory(factory))); } /// /// Registers a new service. Transient is a new instance per get. /// public static void RegisterTransient(Func factory) where TInstance : class { Container.Add(typeof(TInstance), new InjectReference(DefaultFactory(factory))); } // RegisterSingleton /// /// Registers a new service. Singleton is a one instance forever. /// public static void RegisterSingleton() where TInstance : class, new() { Container.Add(typeof(TInterface), new InjectReference(DefaultFactory(), true)); } /// /// Registers a new service. Singleton is a one instance forever. /// public static void RegisterSingleton() where TInstance : class, new() { Container.Add(typeof(TInstance), new InjectReference(DefaultFactory(), true)); } /// /// Registers a new service. Singleton is a one instance forever. /// public static void RegisterSingleton(Func factory) where TInstance : class { Container.Add(typeof(TInterface), new InjectReference(DefaultFactory(factory), true)); } /// /// Registers a new service. Singleton is a one instance forever. /// public static void RegisterSingleton(Func factory) where TInstance : class { Container.Add(typeof(TInstance), new InjectReference(DefaultFactory(factory), true)); } /// /// Registers a new service. Singleton is a one instance forever. /// public static void RegisterSingleton(TInstance instance) where TInstance : class { Container.Add(typeof(TInterface), new InjectReference(instance, true)); } /// /// Registers a new service. Singleton is a one instance forever. /// public static void RegisterSingleton(TInstance instance) where TInstance : class { Container.Add(typeof(TInstance), new InjectReference(instance, true)); } // Unregister /// /// Removes a reference from the container /// public static bool Unregister() where TInterface : class, new() { return Container.Remove(typeof(TInterface)); } /// /// Clears the container /// public static void UnregisterAll() { Container.Clear(); } // Get /// /// Get an instance from the container /// /// /// public static TInterface Get() where TInterface : class { return Get(typeof(TInterface)) as TInterface; } /// /// Get an instance from the container /// /// public static object Get(Type interfaceType) { if (!Container.ContainsKey(interfaceType)) return null; var refer = Container[interfaceType]; if (refer.Instance != null) return refer.Instance; if (refer.Factory != null) { var inst = refer.Factory(); if (refer.IsStatic) { refer.Instance = inst; refer.Factory = null; } return inst; } return null; } // Print /// /// Prints the contents of the container /// public static IEnumerable Print() { foreach (var reference in Container) if (reference.Value.Instance != null) yield return string.Format("{0} with {1} instance", reference.Key, reference.Value.Instance); else if (reference.Value.Factory != null) yield return string.Format("{0} with factory", reference.Key); } // Reflection /// /// Injects dependencies into the object using reflection and the Inject annotation /// /// /// Reflection, Expensive /// /// the instance to find dependencies for public static void InjectInto(object instance) { #if CORE var allFields = instance .GetType() .GetTypeInfo() .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(o => o.GetCustomAttributes(typeof(InjectAttribute),true).Count() > 0) .ToArray(); #else var allFields = instance .GetType() .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(o => o.GetCustomAttributes(typeof(InjectAttribute), true).Length > 0) .ToArray(); #endif FieldInfo field = null; for (var i = 0; i < allFields.Length; i++) try { field = allFields[i]; var type = field.FieldType; field.SetValue(instance, Get(type)); } catch (Exception ex) { if (field != null) throw new Exception("Failed to inject into " + field.Name + "(" + field.FieldType + ")", ex); else throw new Exception("Failed to inject into unknown field", ex); } } #region Private private class InjectReference { public Func Factory; public object Instance; public readonly bool IsStatic; public InjectReference(object instance, bool isStatic = false) { Instance = instance; IsStatic = isStatic; } public InjectReference(Func factory, bool isStatic = false) { Factory = factory; IsStatic = isStatic; } } private static readonly Dictionary Container = new Dictionary(); private static Func DefaultFactory() where TInstance : class, new() { return () => { var instance = new TInstance(); InjectInto(instance); return instance; }; } private static Func DefaultFactory(Func factory) where TInstance : class { return () => { var instance = factory(); InjectInto(instance); return instance; }; } #endregion } } ================================================ FILE: Foundation.Architecture/Architecture/Logging/LogModel.cs ================================================ // Nicholas Ventimiglia 2016-09-07 using System; namespace Foundation.Architecture { /// /// Class of log event /// public enum LogLevel { Info, Warning, Error } /// /// Log information /// public struct LogModel { public LogLevel Level; public string Message; public Exception Exception; } } ================================================ FILE: Foundation.Architecture/Architecture/Logging/LogService.Unity3d.cs ================================================ // Nicholas Ventimiglia 2016-09-05 #if UNITY using System; using UnityEngine; namespace Foundation.Architecture { /// /// Cross platform logging interface /// public class LogService { /// /// extensibility point /// public static event Action OnLog = delegate { }; public static void Log(LogModel model) { switch (model.Level) { case LogLevel.Info: Debug.Log(model.Message); break; case LogLevel.Error: Debug.LogError(model.Message); if (model.Exception != null) Debug.LogException(model.Exception); break; case LogLevel.Warning: Debug.LogWarning(model.Message); break; } OnLog(model); } public static void Log(string message) { Log(new LogModel { Message = message, Level = LogLevel.Info }); } public static void LogWarning(string message) { Log(new LogModel { Message = message, Level = LogLevel.Warning }); } public static void LogError(string message) { Log(new LogModel { Message = message, Level = LogLevel.Error }); } public static void LogException(Exception ex) { Log(new LogModel { Exception = ex, Message = ex.Message, Level = LogLevel.Error }); } public static void LogException(string message, Exception ex) { Log(new LogModel { Exception = ex, Message = message, Level = LogLevel.Error }); } } } #endif ================================================ FILE: Foundation.Architecture/Architecture/Logging/LogService.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; namespace Foundation.Architecture { /// /// Cross platform logging interface /// public static class LogService { /// /// extensibility point /// public static event Action OnLog = delegate { }; public static void Log(LogModel model) { switch (model.Level) { case LogLevel.Error: Console.ForegroundColor = ConsoleColor.Red; break; case LogLevel.Warning: Console.ForegroundColor = ConsoleColor.Yellow; break; } OnLog(model); Console.WriteLine(model.Message + (model.Exception == null ? null : model.Exception.Message)); Console.ResetColor(); } public static void Log(string message) { Log(new LogModel { Message = message, Level = LogLevel.Info }); } public static void LogWarning(string message) { Log(new LogModel { Message = message, Level = LogLevel.Warning }); } public static void LogError(string message) { Log(new LogModel { Message = message, Level = LogLevel.Error }); } public static void LogException(Exception ex) { Log(new LogModel { Exception = ex, Message = ex.Message, Level = LogLevel.Error }); } public static void LogException(string message, Exception ex) { Log(new LogModel { Exception = ex, Message = message, Level = LogLevel.Error }); } } } ================================================ FILE: Foundation.Architecture/Architecture/Messaging/DomainEvents.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; using System.Collections.Generic; namespace Foundation.Architecture { /// /// Generic Message broadcaster /// /// /// Global Message Broker. Routed by Type /// /// the type of message being raised public static class DomainEvents where TMessage : class { /// /// Handler Signature /// /// public delegate void MessageDelegate(TMessage message); /// /// Event /// public static event MessageDelegate OnMessage = delegate { }; /// /// sends a message to subscriptions /// public static void Publish(TMessage message) { OnMessage(message); } /// /// sends a message to subscriptions /// public static void Publish(object message) { OnMessage(message as TMessage); } /// /// Adds a route /// public static void Subscribe(MessageDelegate handler) { OnMessage += handler; } /// /// removes a route /// public static void Unsubscribe(MessageDelegate handler) { OnMessage -= handler; } } /// /// NonGeneric Message broadcaster /// public static class DomainEvents { static Dictionary _cache = new Dictionary(); /// /// Notifies listeners of a new message /// public static void Publish(object message, Type messageType) { if (!_cache.ContainsKey(messageType)) { var info = typeof(DomainEvents<>).MakeGenericType(messageType); var pType = typeof(Action); #if CORE var func = info.GetMethod("Publish").CreateDelegate(pType, null); #else var func = Delegate.CreateDelegate(pType, info, "Publish"); #endif _cache.Add(messageType, func); } (_cache[messageType] as Action).Invoke(message); } /// /// Notifies listeners of a new message /// public static void Publish(TMessage message) where TMessage : class { DomainEvents.Publish(message); } } } ================================================ FILE: Foundation.Architecture/Architecture/Messaging/ObjectEvents.cs ================================================ // Nicholas Ventimiglia 2016-09-06 using System; using System.Collections.Generic; using System.Reflection; namespace Foundation.Architecture { /// /// Generic Message broadcaster with support for filtering based on specific handlers /// /// /// E.G. Send Message to Game Object /// /// The type of route key, generally string or game object /// the type of message being raised public static class ObjectEvents where TMessage : class where TRoute : class { /// /// Handler Signature /// /// public delegate void MessageDelegate(TMessage message); /// /// All Listeners / Observers /// static readonly Dictionary _listeners = new Dictionary(); /// /// sends a message to subscriptions /// public static void Publish(TRoute route, TMessage message) { if (_listeners.ContainsKey(route)) { _listeners[route](message); } } /// /// sends a message to subscriptions /// public static void Publish(object route, object message) { if (_listeners.ContainsKey(route as TRoute)) { _listeners[route as TRoute](message as TMessage); } } /// /// Adds a route /// public static void Subscribe(TRoute route, MessageDelegate handler) { if (!_listeners.ContainsKey(route)) { _listeners.Add(route, delegate { }); } _listeners[route] = Delegate.Combine(_listeners[route], handler) as MessageDelegate; } /// /// removes a handler /// public static void Unsubscribe(TRoute route, MessageDelegate handler) { if (_listeners.ContainsKey(route)) { _listeners[route] = Delegate.Remove(_listeners[route], handler) as MessageDelegate; } } /// /// removes all handlers /// public static void Unsubscribe(TRoute route) { if (_listeners.ContainsKey(route)) { _listeners.Remove(route); } } /// /// removes all handlers /// public static void Clear() { _listeners.Clear(); } } /// /// NonGeneric Message broadcaster /// public static class ObjectEvents { static Dictionary> _cache = new Dictionary>(); /// /// Notifies listeners of a new message /// public static void Publish(object route, object message, Type routeType, Type messageType) { if (!_cache.ContainsKey(routeType)) { _cache.Add(routeType, new Dictionary()); } var inner = _cache[routeType]; if (!inner.ContainsKey(messageType)) { var info = typeof(ObjectEvents<,>).MakeGenericType(routeType, messageType); var pType = typeof(Action); #if CORE var func = info.GetMethod("Publish").CreateDelegate(pType, null); #else var func = Delegate.CreateDelegate(pType, info, "Publish"); #endif inner.Add(messageType, func); } (inner[messageType] as Action).Invoke(route, message); } /// /// Notifies listeners of a new message /// public static void Publish(TRoute route, TMessage message) where TMessage : class where TRoute : class { ObjectEvents.Publish(route, message); } } } ================================================ FILE: Foundation.Architecture/Architecture/Observables/IObservable.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; namespace Foundation.Architecture { /// /// Data Source. Message Publisher Source /// /// public interface IObservable : IDisposable { /// /// Old School Change Delegate /// event Action OnPublish; /// /// Will Publish value /// /// void Publish(TModel model); } } ================================================ FILE: Foundation.Architecture/Architecture/Observables/ListEvent.cs ================================================ using System.Collections.Generic; namespace Foundation.Architecture { /// /// List event type /// public enum ListChangedEventType { /// /// List.Add(index, value); /// Add, /// /// List.Remove(index, value); /// Remove, /// /// List[i].RaiseChange(); /// Refresh, /// /// List.Add(index, value) /// Insert, /// /// List[i] = value; /// Replace, /// /// List.Clear(); /// Clear } /// /// List Changed Args /// public struct ListEvent { public ListChangedEventType Event; public IEnumerable Items; /// /// Used for replace and Insert /// public int Index; } } ================================================ FILE: Foundation.Architecture/Architecture/Observables/ObservableBehaviour.cs ================================================ #if UNITY // Nicholas Ventimiglia 2016-09-05 using System; using UnityEngine; namespace Foundation.Architecture { /// /// Implements IPropertyChanged for MonoBehaviour /// public class ObservableBehaviour : MonoBehaviour, IObservable { /// /// Listeners /// public event Action OnPublish = delegate { }; /// /// Raise Change /// /// public void Publish(PropertyEvent model) { OnPublish(model); } /// /// Raise Change on a single property /// public void RaiseChange(string memberName, T value) { OnPublish(new PropertyEvent { Sender = this, Name = memberName, Value = value }); } /// /// Raise Change All /// public void RaiseChange() { OnPublish(new PropertyEvent { Sender = this }); } public void Dispose() { OnPublish = delegate { }; } } } #endif ================================================ FILE: Foundation.Architecture/Architecture/Observables/ObservableList.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; using System.Collections; using System.Collections.Generic; using System.Linq; #if UNITY using UnityEngine; #endif namespace Foundation.Architecture { /// /// For controllers with an observable model. /// /// // WEBGL [Serializable] public class ObservableList : IEnumerable, IObservable where T : class { #region IObservable public event Action OnPublish = delegate { }; public void Subscribe(Action handler) { OnPublish += handler; handler(new ListEvent { Event = ListChangedEventType.Add, #if UNITY Items = InternalList.ToArray(), #else Items = InternalList, #endif }); } public void Unsubscribe(Action handler) { OnPublish -= handler; } public void Publish(ListEvent model) { OnPublish(model); } public void Publish(ListChangedEventType e, object item) { OnPublish(new ListEvent { Event = e, Items = new []{ item }, }); } public void Publish(ListChangedEventType e, IEnumerable items) { OnPublish(new ListEvent { Event = e, Items = (object[])items, }); } public void Dispose() { if (CanRefresh) { for (int i = 0; i < InternalList.Count(); i++) { UnbindRefresh(InternalList.ElementAt(i) as IObservable); } } InternalList.Clear(); OnPublish = delegate { }; } #endregion #region IEnumerable #if UNITY [SerializeField] #endif public List InternalList = new List(); public IComparer Comperer; public ObservableList() { } public ObservableList(IEnumerable set) { InternalList = new List(set); } public virtual void Add(T model) { if (CanRefresh) { BindRefresh(model as IObservable); } InternalList.Add(model); if (Comperer != null) InternalList.Sort(Comperer); Publish(ListChangedEventType.Add, model); } public virtual void AddRange(IEnumerable models) { if (CanRefresh) { for (int i = 0; i < models.Count(); i++) { BindRefresh(models.ElementAt(i) as IObservable); } } InternalList.AddRange(models); if (Comperer != null) InternalList.Sort(Comperer); Publish(ListChangedEventType.Add, models); } public virtual void Insert(int index, T model) { if (CanRefresh) { UnbindRefresh(model as IObservable); } InternalList.Insert(index, model); Publish(new ListEvent { Event = ListChangedEventType.Insert, Index = index, Items = new[] { model } }); } public virtual void Remove(T model) { if (CanRefresh) { UnbindRefresh(model as IObservable); } InternalList.Remove(model); Publish(ListChangedEventType.Remove, model); } public virtual void RemoveRange(IEnumerable models) { if (CanRefresh) { for (int i = 0; i < models.Count(); i++) { UnbindRefresh(models.ElementAt(i) as IObservable); } } for (int i = 0; i < models.Count(); i++) { InternalList.Remove(models.ElementAt(i)); } Publish(ListChangedEventType.Remove, models); } public virtual void Replace(T model) { Remove(model); Add(model); } public virtual void AddOrReplace(T model) { if (InternalList.Contains(model)) { Replace(model); } else { Add(model); } } public virtual int IndexOf(T model) { return InternalList.IndexOf(model); } public void Clear() { InternalList.Clear(); Publish(ListChangedEventType.Clear, null); } public void Sort() { InternalList.Sort(); } public bool Contains(T model) { return InternalList.Contains(model); } public int Count { get { return InternalList.Count; } } public T this[int index] { get { return InternalList[index]; } set { InternalList[index] = value; Publish(new ListEvent { Event = ListChangedEventType.Replace, Index = index, Items = new []{value} }); } } public IEnumerator GetEnumerator() { return InternalList.GetEnumerator(); } public IEnumerable GetEnumerable() { return InternalList; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } #endregion #region Refresh Binding // Subscribes to the item in the collection. // Raises a 'item refreshed' when that item says to. bool CanRefresh { get { return typeof(T).IsAssignableFrom(typeof(IObservable)); } } void BindRefresh(IObservable model) { model.OnPublish += OnRefresh; } void UnbindRefresh(IObservable model) { model.OnPublish -= OnRefresh; } void OnRefresh(PropertyEvent args) { if (!args.IsRefreshAll) return; Publish(ListChangedEventType.Refresh, args.Sender); } #endregion } } ================================================ FILE: Foundation.Architecture/Architecture/Observables/ObservableObject.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; namespace Foundation.Architecture { /// /// Implements IPropertyChanged for Non-Monobehaviours /// public class ObservableObject : IObservable { /// /// Listeners /// public event Action OnPublish = delegate { }; /// /// Raise Change /// /// public void Publish(PropertyEvent model) { OnPublish(model); } /// /// Raise Change on a single property /// public void RaiseChange(string memberName, T value) { OnPublish(new PropertyEvent { Sender = this, Name = memberName, Value = value }); } /// /// Raise Change All /// public void RaiseChange() { OnPublish(new PropertyEvent { Sender = this }); } public void Dispose() { OnPublish = delegate { }; } } } ================================================ FILE: Foundation.Architecture/Architecture/Observables/ObservableProperty.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; namespace Foundation.Architecture { /// /// Wrapps a property with on change internally /// /// public class ObservableProperty : IEquatable, IObservable { private event Action _onPublish = delegate { }; public event Action OnPublish { add { _onPublish += value; value(Value); } remove { _onPublish -= value; } } private IObservable _parent; private string _memberName; private T _value; public T Value { get { return _value; } set { Set(value); } } /// /// CTOR /// public ObservableProperty() { } /// /// For Chaining /// public ObservableProperty(string memberName, IObservable parent) { Bind(memberName, parent); } /// /// Set value without notifing subscribers /// /// public void SetValueSilently(T value) { _value = value; } /// /// Set value /// /// public void Set(T value) { _value = value; _onPublish(value); if (_parent != null) { _parent.Publish(new PropertyEvent { Sender = _parent, Name = _memberName, Value = _value, }); } } /// /// Get value /// /// public T Get() { return _value; } /// /// Notify Listeners /// /// public void Publish(T model) { Value = model; } /// /// For Chaining MVVM /// public void Bind(string memberName, IObservable parent) { _parent = parent; _memberName = memberName; } /// /// Clears it /// public void Dispose() { _parent = null; _memberName = null; _value = default(T); _onPublish = delegate { }; } public bool Equals(T other) { return _value.Equals(other); } public static implicit operator T(ObservableProperty observable) { return observable.Value; } } } ================================================ FILE: Foundation.Architecture/Architecture/Observables/ObservableProxy.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace Foundation.Architecture { /// /// Reflection Proxy. Wraps around an object and caches all reflection calls for a ~300% improvement. /// public class ObservableProxy : IObservable { #region Api public object Instance { get; private set; } public Type InstanceType { get; private set; } Dictionary>> Handlers = new Dictionary>>(); /// /// Call a member /// public T Get(string memberName) { try { DelegateInfo temp; if (_cacheGet.TryGetValue(memberName, out temp)) { var val = (temp.Delegate).DynamicInvoke(); return (T)Convert(val, typeof(T)); } LogService.LogWarning("Unknown member " + memberName + " of " + typeof(T).Name + " on " + InstanceType.Name); return default(T); } catch (Exception ex) { LogService.LogError("Failed to call member " + memberName + " of " + typeof(T).Name + " with void"); LogService.LogException(ex); return default(T); } } /// /// Call a member /// public void Post(string memberName, object value = null) { try { DelegateInfo temp; if (_cacheSet.TryGetValue(memberName, out temp)) { if (value == null) { (temp.Delegate as Action).Invoke(); } else { (temp.Delegate).DynamicInvoke(Convert(value, temp.Type)); } } else { LogService.LogWarning("Unknown member " + memberName + " on " + InstanceType.Name); } } catch (Exception ex) { LogService.LogError("Failed to call member " + memberName + " on " + InstanceType.Name); LogService.LogException(ex); } } /// /// Member specific listener /// public void Subscribe(string memberName, Action handler) { List> events; if (!Handlers.TryGetValue(memberName, out events)) { events = new List>(); Handlers.Add(memberName, events); } events.Add(handler); } /// /// Member specific listener /// public void Unsubscribe(string memberName, Action handler) { List> events; if (Handlers.TryGetValue(memberName, out events)) { events = new List>(); events.Remove(handler); } } public ObservableProxy(object instance) { Instance = instance; if (Instance is IObservable) { ((IObservable)Instance).OnPublish += Publish; } BuildCache(); } public void Dispose() { if (Instance is IObservable) { ((IObservable)Instance).OnPublish -= Publish; } Instance = null; Handlers.Clear(); _cacheGet.Clear(); _cacheSet.Clear(); } object Convert(object value, Type type) { if (type == null || value == null || value.GetType() == type) return value; return System.Convert.ChangeType(value, type); } #endregion #region IObservable public event Action OnPublish = delegate { }; public void Publish(PropertyEvent model) { OnPublish(model); } #endregion #region Caching struct DelegateInfo { public Delegate Delegate; public Type Type; public DelegateInfo(Delegate d, Type t) { Delegate = d; Type = t; } } private Dictionary _cacheGet = new Dictionary(); private Dictionary _cacheSet = new Dictionary(); void BuildCache() { InstanceType = Instance.GetType(); //Methods CacheMethods(); CacheProperties(); } void CacheMethods() { var methods = InstanceType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance) .Where(m => !m.IsSpecialName); foreach (var member in methods) { if (_cacheSet.ContainsKey(member.Name)) { LogService.LogWarning("Duplicate member " + member.Name + " on " + InstanceType.Name); continue; } var ptype = member.GetParameters(); // Note : Would be nice to invoke coroutines here, NV if (ptype.Length == 0) { var del = CreateDelegate(typeof(Action), Instance, member); _cacheSet.Add(member.Name, new DelegateInfo(del, null)); } else { var type = typeof(Action<>).MakeGenericType(ptype[0].ParameterType); var del = CreateDelegate(type, Instance, member); _cacheSet.Add(member.Name, new DelegateInfo(del, ptype[0].ParameterType)); } } } void CacheProperties() { var members = InstanceType.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var member in members) { if (_cacheSet.ContainsKey(member.Name) || _cacheSet.ContainsKey(member.Name)) { LogService.LogWarning("Duplicate member " + member.Name + " on " + InstanceType.Name); continue; } var gtype = typeof(Func<>).MakeGenericType(member.PropertyType); var get = CreateDelegate(gtype, Instance, member.GetGetMethod()); _cacheGet.Add(member.Name, new DelegateInfo(get, member.PropertyType)); var stype = typeof(Action<>).MakeGenericType(member.PropertyType); var set = CreateDelegate(stype, Instance, member.GetSetMethod()); _cacheSet.Add(member.Name, new DelegateInfo(set, member.PropertyType)); } } Delegate CreateDelegate(Type type, Object target, MethodInfo method) { #if CORE return method.CreateDelegate(type, target); #else return Delegate.CreateDelegate(type, target, method); #endif } #endregion } } ================================================ FILE: Foundation.Architecture/Architecture/Observables/PropertyEvent.cs ================================================ namespace Foundation.Architecture { /// /// MVVM Event Arguments /// public struct PropertyEvent { /// /// The Model /// public object Sender; /// /// Member name (property / method) /// public string Name; /// /// New Value /// public object Value; /// /// Refresh root /// public bool IsRefreshAll { get { return string.IsNullOrEmpty(Name); } } } } ================================================ FILE: Foundation.Architecture/Architecture/Observables/ReflectionExt.cs ================================================ using System; using System.Reflection; namespace Foundation.Architecture { public static class ReflectionExt { public static FieldInfo[] GetFields(this Type type, BindingFlags bindingAttr) { return type.GetTypeInfo().GetFields(bindingAttr); } public static PropertyInfo[] GetProperties(this Type type, BindingFlags bindingAttr) { return type.GetTypeInfo().GetProperties(bindingAttr); } public static MethodInfo[] GetMethods(this Type type, BindingFlags bindingAttr) { return type.GetTypeInfo().GetMethods(bindingAttr); } public static Type[] GetGenericArguments(this Type type) { return type.GetTypeInfo().GetGenericArguments(); } public static EventInfo GetEvent(this Type type, string name) { return type.GetTypeInfo().GetEvent(name); } public static MethodInfo GetMethod(this Type type, string name) { return type.GetTypeInfo().GetMethod(name); } public static MethodInfo CreateDelegate(this Type type, string name) { return type.GetTypeInfo().GetMethod(name); } } } ================================================ FILE: Foundation.Architecture/Architecture/Pooling/Pool.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System.Collections.Generic; namespace Foundation.Architecture { /// /// A very simple object pool /// /// /// Not thread safe /// /// public class Pool where T : new() { /// /// Global Singleton /// public static readonly Pool Default = new Pool(); private readonly Stack _items = new Stack(); /// /// Rents an item from the pool /// /// public T Rent() { var result = _items.Count > 0 ? _items.Pop() : new T(); return result; } /// /// Return the item to the pool /// /// public void Return(T item) { _items.Push(item); } /// /// clears the pool /// public void Clear() { _items.Clear(); } } } ================================================ FILE: Foundation.Architecture/Architecture/Pooling/ThreadSafePool.cs ================================================ // Nicholas Ventimiglia 2016-09-07 using System.Collections.Generic; namespace Foundation.Architecture { /// /// A very simple object pool /// /// /// thread safe /// /// public class ThreadSafePool where T : new() { /// /// Global Singleton /// public static readonly ThreadSafePool Default = new ThreadSafePool(); private readonly Stack _items = new Stack(); private readonly object _lock = new object(); /// /// Rents an item from the pool /// /// public T Rent() { lock (_lock) { var result = _items.Count > 0 ? _items.Pop() : new T(); return result; } } /// /// Return the item to the pool /// /// public void Return(T item) { lock (_lock) { _items.Push(item); } } /// /// clears the pool /// public void Clear() { lock (_lock) { _items.Clear(); } } } } ================================================ FILE: Foundation.Architecture/Architecture/Properties/AssemblyInfo.cs ================================================ // Nicholas Ventimiglia 2016-09-05 using System.Reflection; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Architecture")] [assembly: AssemblyDescription("Common Services and Components")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("NVentimiglia")] [assembly: AssemblyProduct("Foundation.Architecture")] [assembly: AssemblyCopyright("Copyright © 2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("f38f800f-d4d8-48e4-9a2c-b0518be831cb")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Foundation.Architecture/Architecture/Threading/AsyncLock.cs ================================================ // Nicholas Ventimiglia 2016-09-07 using System; using System.Threading; using System.Threading.Tasks; namespace Foundation.Architecture { /// /// A lock that supports awaiting on tasks while locked // http://blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988.aspx /// public class AsyncLock { private readonly AsyncSemaphore m_semaphore; private readonly Task m_releaser; public AsyncLock() { m_semaphore = new AsyncSemaphore(1); m_releaser = Task.FromResult(new Releaser(this)); } public Task LockAsync() { var wait = m_semaphore.WaitAsync(); return wait.IsCompleted ? m_releaser : wait.ContinueWith((_, state) => new Releaser((AsyncLock) state), this, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); } public struct Releaser : IDisposable { private readonly AsyncLock m_toRelease; internal Releaser(AsyncLock toRelease) { m_toRelease = toRelease; } public void Dispose() { if (m_toRelease != null) m_toRelease.m_semaphore.Release(); } } } } ================================================ FILE: Foundation.Architecture/Architecture/Threading/AsyncSemaphore.cs ================================================ // Nicholas Ventimiglia 2016-09-07 using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Foundation.Architecture { /// /// See AsyncLock /// public class AsyncSemaphore { private readonly static Task s_completed = Task.FromResult(true); private readonly Queue> m_waiters = new Queue>(); private int m_currentCount; public AsyncSemaphore(int initialCount) { if (initialCount < 0) throw new ArgumentOutOfRangeException("initialCount"); m_currentCount = initialCount; } public Task WaitAsync() { lock (m_waiters) { if (m_currentCount > 0) { --m_currentCount; return s_completed; } else { var waiter = new TaskCompletionSource(); m_waiters.Enqueue(waiter); return waiter.Task; } } } public void Release() { TaskCompletionSource toRelease = null; lock (m_waiters) { if (m_waiters.Count > 0) toRelease = m_waiters.Dequeue(); else ++m_currentCount; } if (toRelease != null) toRelease.SetResult(true); } } } ================================================ FILE: Foundation.Architecture/Architecture/Threading/Internal/AsyncThreadService.cs ================================================ using System; using System.Collections; using System.Threading.Tasks; namespace Foundation.Architecture.Internal { public class AsyncThreadService : IThreadingService { public class ThreadTask : IDisposable { public bool IsDisposed; public void Dispose() { IsDisposed = true; } } public bool IsMainThread { get { return true; } } public IDisposable RunUpdate(Action callback) { var task = new ThreadTask(); task.IsDisposed = false; RunUpdate(callback, task); return task; } public IDisposable RunDelay(Action callback, float seconds = 5) { var task = new ThreadTask(); task.IsDisposed = false; RunUpdate(callback, seconds, task); return task; } public void RunRoutine(IEnumerator routine) { RunRoutineAsync(routine); } public void RunMainThread(Action action) { //NotImplemented action(); } public void RunBackgroundThread(Action action) { //NotImplemented action(); } public void RunBackgroundThread(Action backgroundWork, Action mainWork) { //NotImplemented backgroundWork(); mainWork(); } async void RunUpdate(Action callback, ThreadTask task) { var startTime = DateTime.UtcNow; double delta; while (!task.IsDisposed) { //60 fps delta = (DateTime.UtcNow - startTime).TotalMilliseconds; startTime = DateTime.UtcNow; callback(delta); await Task.Delay(16); } } async void RunUpdate(Action callback, float seconds, ThreadTask task) { await Task.Delay(TimeSpan.FromSeconds(seconds)); if (!task.IsDisposed) { callback(); } } async void RunRoutineAsync(IEnumerator routine) { do { //60 fps await Task.Delay(16); } while (routine.MoveNext()); } } } ================================================ FILE: Foundation.Architecture/Architecture/Threading/Internal/IThreadingService.cs ================================================ // Nicholas Ventimiglia 2016-09-07 using System; using System.Collections; namespace Foundation.Architecture.Internal { /// /// Main thread / Background thread utility /// /// /// Games need consistent threading / time logic on server and client. /// public interface IThreadingService { /// /// Checks if this is the main thread /// bool IsMainThread { get; } /// /// A long running (continuous) update loop /// /// Update Handler with delta time parameter /// IDisposable RunUpdate(Action callback); /// /// Registers a timeout (Wait and Invoke) /// IDisposable RunDelay(Action callback, float seconds = 5); /// /// A Coroutine. Like an Update Loop, but, execution broken up by yields /// void RunRoutine(IEnumerator routine); /// /// Executes an action on the main thread /// void RunMainThread(Action action); /// /// Executes an action on the background thread (if possible - webGl) /// void RunBackgroundThread(Action action); /// /// Run a background job with completion /// void RunBackgroundThread(Action backgroundWork, Action mainWork); } } ================================================ FILE: Foundation.Architecture/Architecture/Threading/Internal/UnityThreadService.cs ================================================ #if UNITY using System; using System.Collections; using UnityEngine; using System.Collections.Generic; #if USE_THREAD using System.Threading; #endif namespace Foundation.Architecture.Internal { public class UnityThreadService : MonoBehaviour, IThreadingService { #region Defines public class UpdateTask : IDisposable { public Action Action; public Action Cleanup; public bool IsDisposed; public void Dispose() { Cleanup(this); Cleanup = null; Action = null; IsDisposed = true; //Note : for pooling confirm not used by client and controller. Double Dispose ? } } public class RoutineTask : IDisposable { public IEnumerator Routine; public bool IsDisposed; public void Dispose() { Routine = null; IsDisposed = true; //Note : for pooling confirm not used by client and controller. Double Dispose ? } } public class JobTask { public Action Background; public Action Main; } #endregion #region API public IDisposable RunUpdate(Action callback) { var task = new UpdateTask { Cleanup = Remove }; task.Action = callback; lock (pendingUpdates) { pendingUpdates.Add(task); hasUpdates = true; } return task; } public IDisposable RunDelay(Action callback, float seconds = 5) { var task = new RoutineTask(); task.Routine = RunDelayAsync(callback, seconds, task); lock (pendingRoutine) { pendingRoutine.Enqueue(task); hasRoutine = true; } return task; } public void RunRoutine(IEnumerator routine) { var task = new RoutineTask(); task.Routine = routine; lock (pendingRoutine) { pendingRoutine.Enqueue(task); hasRoutine = true; } } public void RunMainThread(Action action) { #if USE_THREAD lock (pendingMain) { pendingMain.Enqueue(action); hasMain = true; } #else action(); #endif } public void RunBackgroundThread(Action action) { #if USE_THREAD lock (pendingBack) { pendingBack.Enqueue(new JobTask { Background = action }); hasBack = true; } #else action(); #endif } public void RunBackgroundThread(Action bgAction, Action mainAction) { #if USE_THREAD lock (pendingBack) { pendingBack.Enqueue(new JobTask { Background = bgAction, Main = mainAction }); hasBack = true; } #else bgAction(); mainAction(); #endif } #endregion #region Implementation private static UnityThreadService _instance; //[RuntimeInitializeOnLoadMethod] public static UnityThreadService Init() { if (_instance == null) { var go = new GameObject("_UnityThreadService"); DontDestroyOnLoad(go); _instance = go.AddComponent(); } return _instance; } private readonly List pendingUpdates = new List(); private readonly Queue pendingBack = new Queue(); private readonly Queue pendingMain = new Queue(); private readonly Queue pendingRoutine = new Queue(); private volatile bool hasUpdates; private volatile bool hasBack; private volatile bool hasMain; private volatile bool hasRoutine; private static volatile bool alive; private DateTime lastUpdate; #if USE_THREAD private Thread workThread; private Thread mainThread; /// /// Checks if this is the main thread /// public bool IsMainThread { get { return Thread.CurrentThread == mainThread; } } #else /// /// Checks if this is the main thread /// public bool IsMainThread { get { return true; } } #endif void Awake() { #if USE_THREAD mainThread = Thread.CurrentThread; #endif _instance = this; } void Start() { #if USE_THREAD workThread = new Thread(() => { while (alive) { try { lock (pendingBack) { while (pendingBack.Count > 0) { var job = pendingBack.Dequeue(); job.Background(); if (job.Main != null) RunMainThread(job.Main); } } } catch (Exception ex) { LogService.LogException("UnityThreadService", ex); } //60 fps Thread.Sleep(16); } }); workThread.IsBackground = true; workThread.Start(); #endif // lastUpdate = DateTime.UtcNow; } void OnDestroy() { _instance = null; alive = false; } void Update() { // var delta = (DateTime.UtcNow - lastUpdate).TotalMilliseconds; // lastUpdate = DateTime.UtcNow; if (hasUpdates) { lock (pendingUpdates) { for (int i = 0; i < pendingUpdates.Count; i++) { pendingUpdates[i].Action(Time.deltaTime); } } } if (hasMain) { try { lock (pendingMain) { while (pendingMain.Count > 0) { pendingMain.Dequeue()(); } hasMain = false; } } catch (Exception ex) { LogService.LogException("UnityThreadService.pendingMain", ex); } } if (hasRoutine) { try { lock (pendingRoutine) { while (pendingRoutine.Count > 0) { StartCoroutine(pendingRoutine.Dequeue().Routine); hasRoutine = false; } } } catch (Exception ex) { LogService.LogException("UnityThreadService.pendingRoutine", ex); } } } IEnumerator RunDelayAsync(Action callback, float seconds, RoutineTask task) { yield return new WaitForSecondsRealtime(seconds); if (!task.IsDisposed) callback(); } void Remove(UpdateTask task) { lock (pendingUpdates) { pendingUpdates.Remove(task); hasUpdates = pendingUpdates.Count > 0; } } #endregion } } #endif ================================================ FILE: Foundation.Architecture/Architecture/Threading/RoutineTimer.cs ================================================ // Nicholas Ventimiglia 2016-09-07 using System; namespace Foundation.Architecture { /// /// A platform agnostic timer with callback helper /// public class RoutineTimer : IDisposable { public TimeSpan Interval { get; private set; } public Action Callback { get; private set; } public bool IsRunning { get; private set; } private IDisposable routine; private double delta; public RoutineTimer(TimeSpan interval, Action callback) { Callback = callback; Interval = interval; } public void Dispose() { Stop(); Callback = null; } public RoutineTimer Stop() { if (routine != null) { routine.Dispose(); routine = null; } IsRunning = false; return this; } public RoutineTimer Start() { if (!IsRunning) { IsRunning = true; routine = ThreadingService.RunUpdate(Handler); } return this; } void Handler(double d) { if (!IsRunning) return; delta += d; if (delta >= Interval.TotalMilliseconds) { delta = 0; Callback(); } } } } ================================================ FILE: Foundation.Architecture/Architecture/Threading/ThreadingService.cs ================================================ using System; using System.Collections; using Foundation.Architecture.Internal; namespace Foundation.Architecture { /// /// Main thread / Background thread utility /// /// /// Games need consistent threading / time logic on server and client. /// public static class ThreadingService { #if UNITY static readonly IThreadingService Instance = UnityThreadService.Init(); #else static readonly IThreadingService Instance = new AsyncThreadService(); #endif /// /// Checks if this is the main thread /// public static bool IsMainThread { get { return Instance.IsMainThread; } } /// /// A long running (continuous) update loop /// /// Update Handler with delta time parameter /// public static IDisposable RunUpdate(Action callback) { return Instance.RunUpdate(callback); } /// /// Registers a timeout (Wait and Invoke) /// public static IDisposable RunDelay(Action callback, float seconds = 5) { return Instance.RunDelay(callback, seconds); } /// /// A Coroutine. Like an Update Loop, but, execution broken up by yields /// public static void RunRoutine(IEnumerator routine) { Instance.RunRoutine(routine); } /// /// Executes an action on the main thread /// public static void RunMainThread(Action action) { Instance.RunDelay(action); } /// /// Executes an action on the background thread (if possible - webGl) /// public static void RunBackgroundThread(Action action) { Instance.RunBackgroundThread(action); } /// /// Run a background job with completion /// public static void RunBackgroundThread(Action backgroundWork, Action mainWork) { Instance.RunBackgroundThread(backgroundWork, mainWork); } } } ================================================ FILE: Foundation.Architecture/Architecture/packages.config ================================================  ================================================ FILE: Foundation.Architecture/Architecture.Core/Architecture.Core.xproj ================================================  14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 0cafb5cc-49cc-4665-a226-99df505c6a46 Architecture.Core .\obj .\bin\ v4.5.2 2.0 ================================================ FILE: Foundation.Architecture/Architecture.Core/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Architecture.Core")] [assembly: AssemblyTrademark("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("0cafb5cc-49cc-4665-a226-99df505c6a46")] ================================================ FILE: Foundation.Architecture/Architecture.Core/project.json ================================================ { "name": "Foundation.Architecture", "description": "Common architecture componenets", "copyright": "NicholasVentimiglia.com", "version": "1.0.0-*", "dependencies": { "NETStandard.Library": "1.6.0", "Newtonsoft.Json": "9.0.1" }, "frameworks": { "netstandard1.6": { "imports": "dnxcore50" } }, "buildOptions": { "allowUnsafe": true, "compile": { "include": [ "../Architecture/Data/**.cs", "../Architecture/Logging/**.cs", "../Architecture/Injector/**.cs", "../Architecture/Messaging/**.cs", "../Architecture/Observables/**.cs", "../Architecture/Pooling/**.cs", "../Architecture/Threading/**.cs" ], "exclude": [ //Ignore Stuff "AssemblyInfo.cs", "**AssemblyInfo.cs" ] }, "define": [ "CORE" ] } } ================================================ FILE: Foundation.Architecture/Architecture.Core/project.lock.json ================================================ { "locked": false, "version": 2, "targets": { ".NETStandard,Version=v1.6": { "Microsoft.CSharp/4.0.1": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Dynamic.Runtime": "4.0.11", "System.Globalization": "4.0.11", "System.Linq": "4.1.0", "System.Linq.Expressions": "4.1.0", "System.ObjectModel": "4.0.12", "System.Reflection": "4.1.0", "System.Reflection.Extensions": "4.0.1", "System.Reflection.Primitives": "4.0.1", "System.Reflection.TypeExtensions": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.InteropServices": "4.1.0", "System.Threading": "4.0.11" }, "compile": { "ref/netstandard1.0/Microsoft.CSharp.dll": {} }, "runtime": { "lib/netstandard1.3/Microsoft.CSharp.dll": {} } }, "Microsoft.NETCore.Platforms/1.0.1": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.NETCore.Targets/1.0.1": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "Microsoft.Win32.Primitives/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/Microsoft.Win32.Primitives.dll": {} } }, "NETStandard.Library/1.6.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.Win32.Primitives": "4.0.1", "System.AppContext": "4.1.0", "System.Collections": "4.0.11", "System.Collections.Concurrent": "4.0.12", "System.Console": "4.0.0", "System.Diagnostics.Debug": "4.0.11", "System.Diagnostics.Tools": "4.0.1", "System.Diagnostics.Tracing": "4.1.0", "System.Globalization": "4.0.11", "System.Globalization.Calendars": "4.0.1", "System.IO": "4.1.0", "System.IO.Compression": "4.1.0", "System.IO.Compression.ZipFile": "4.0.1", "System.IO.FileSystem": "4.0.1", "System.IO.FileSystem.Primitives": "4.0.1", "System.Linq": "4.1.0", "System.Linq.Expressions": "4.1.0", "System.Net.Http": "4.1.0", "System.Net.Primitives": "4.0.11", "System.Net.Sockets": "4.1.0", "System.ObjectModel": "4.0.12", "System.Reflection": "4.1.0", "System.Reflection.Extensions": "4.0.1", "System.Reflection.Primitives": "4.0.1", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Runtime.InteropServices": "4.1.0", "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", "System.Runtime.Numerics": "4.0.1", "System.Security.Cryptography.Algorithms": "4.2.0", "System.Security.Cryptography.Encoding": "4.0.0", "System.Security.Cryptography.Primitives": "4.0.0", "System.Security.Cryptography.X509Certificates": "4.1.0", "System.Text.Encoding": "4.0.11", "System.Text.Encoding.Extensions": "4.0.11", "System.Text.RegularExpressions": "4.1.0", "System.Threading": "4.0.11", "System.Threading.Tasks": "4.0.11", "System.Threading.Timer": "4.0.1", "System.Xml.ReaderWriter": "4.0.11", "System.Xml.XDocument": "4.0.11" } }, "Newtonsoft.Json/9.0.1": { "type": "package", "dependencies": { "Microsoft.CSharp": "4.0.1", "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Dynamic.Runtime": "4.0.11", "System.Globalization": "4.0.11", "System.IO": "4.1.0", "System.Linq": "4.1.0", "System.Linq.Expressions": "4.1.0", "System.ObjectModel": "4.0.12", "System.Reflection": "4.1.0", "System.Reflection.Extensions": "4.0.1", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Serialization.Primitives": "4.1.1", "System.Text.Encoding": "4.0.11", "System.Text.Encoding.Extensions": "4.0.11", "System.Text.RegularExpressions": "4.1.0", "System.Threading": "4.0.11", "System.Threading.Tasks": "4.0.11", "System.Xml.ReaderWriter": "4.0.11", "System.Xml.XDocument": "4.0.11" }, "compile": { "lib/netstandard1.0/Newtonsoft.Json.dll": {} }, "runtime": { "lib/netstandard1.0/Newtonsoft.Json.dll": {} } }, "runtime.native.System/4.0.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "runtime.native.System.IO.Compression/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "runtime.native.System.Net.Http/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "runtime.native.System.Security.Cryptography/4.0.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "System.AppContext/4.1.0": { "type": "package", "dependencies": { "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.6/System.AppContext.dll": {} }, "runtime": { "lib/netstandard1.6/System.AppContext.dll": {} } }, "System.Buffers/4.0.0": { "type": "package", "dependencies": { "System.Diagnostics.Debug": "4.0.11", "System.Diagnostics.Tracing": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Threading": "4.0.11" }, "compile": { "lib/netstandard1.1/_._": {} }, "runtime": { "lib/netstandard1.1/System.Buffers.dll": {} } }, "System.Collections/4.0.11": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/System.Collections.dll": {} } }, "System.Collections.Concurrent/4.0.12": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Diagnostics.Tracing": "4.1.0", "System.Globalization": "4.0.11", "System.Reflection": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Threading": "4.0.11", "System.Threading.Tasks": "4.0.11" }, "compile": { "ref/netstandard1.3/System.Collections.Concurrent.dll": {} }, "runtime": { "lib/netstandard1.3/System.Collections.Concurrent.dll": {} } }, "System.Console/4.0.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.IO": "4.1.0", "System.Runtime": "4.1.0", "System.Text.Encoding": "4.0.11" }, "compile": { "ref/netstandard1.3/System.Console.dll": {} } }, "System.Diagnostics.Debug/4.0.11": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/System.Diagnostics.Debug.dll": {} } }, "System.Diagnostics.DiagnosticSource/4.0.0": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Diagnostics.Tracing": "4.1.0", "System.Reflection": "4.1.0", "System.Runtime": "4.1.0", "System.Threading": "4.0.11" }, "compile": { "lib/netstandard1.3/_._": {} }, "runtime": { "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {} } }, "System.Diagnostics.Tools/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.0/System.Diagnostics.Tools.dll": {} } }, "System.Diagnostics.Tracing/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.5/System.Diagnostics.Tracing.dll": {} } }, "System.Dynamic.Runtime/4.0.11": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Globalization": "4.0.11", "System.Linq": "4.1.0", "System.Linq.Expressions": "4.1.0", "System.ObjectModel": "4.0.12", "System.Reflection": "4.1.0", "System.Reflection.Emit": "4.0.1", "System.Reflection.Emit.ILGeneration": "4.0.1", "System.Reflection.Primitives": "4.0.1", "System.Reflection.TypeExtensions": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Threading": "4.0.11" }, "compile": { "ref/netstandard1.3/System.Dynamic.Runtime.dll": {} }, "runtime": { "lib/netstandard1.3/System.Dynamic.Runtime.dll": {} } }, "System.Globalization/4.0.11": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/System.Globalization.dll": {} } }, "System.Globalization.Calendars/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Globalization": "4.0.11", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/System.Globalization.Calendars.dll": {} } }, "System.Globalization.Extensions/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "System.Globalization": "4.0.11", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.InteropServices": "4.1.0" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Globalization.Extensions.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Globalization.Extensions.dll": { "assetType": "runtime", "rid": "win" } } }, "System.IO/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0", "System.Text.Encoding": "4.0.11", "System.Threading.Tasks": "4.0.11" }, "compile": { "ref/netstandard1.5/System.IO.dll": {} } }, "System.IO.Compression/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.IO": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Runtime.InteropServices": "4.1.0", "System.Text.Encoding": "4.0.11", "System.Threading": "4.0.11", "System.Threading.Tasks": "4.0.11", "runtime.native.System": "4.0.0", "runtime.native.System.IO.Compression": "4.1.0" }, "compile": { "ref/netstandard1.3/System.IO.Compression.dll": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll": { "assetType": "runtime", "rid": "win" } } }, "System.IO.Compression.ZipFile/4.0.1": { "type": "package", "dependencies": { "System.Buffers": "4.0.0", "System.IO": "4.1.0", "System.IO.Compression": "4.1.0", "System.IO.FileSystem": "4.0.1", "System.IO.FileSystem.Primitives": "4.0.1", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Text.Encoding": "4.0.11" }, "compile": { "ref/netstandard1.3/System.IO.Compression.ZipFile.dll": {} }, "runtime": { "lib/netstandard1.3/System.IO.Compression.ZipFile.dll": {} } }, "System.IO.FileSystem/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.IO": "4.1.0", "System.IO.FileSystem.Primitives": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Text.Encoding": "4.0.11", "System.Threading.Tasks": "4.0.11" }, "compile": { "ref/netstandard1.3/System.IO.FileSystem.dll": {} } }, "System.IO.FileSystem.Primitives/4.0.1": { "type": "package", "dependencies": { "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} }, "runtime": { "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} } }, "System.Linq/4.1.0": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0" }, "compile": { "ref/netstandard1.6/System.Linq.dll": {} }, "runtime": { "lib/netstandard1.6/System.Linq.dll": {} } }, "System.Linq.Expressions/4.1.0": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Globalization": "4.0.11", "System.IO": "4.1.0", "System.Linq": "4.1.0", "System.ObjectModel": "4.0.12", "System.Reflection": "4.1.0", "System.Reflection.Emit": "4.0.1", "System.Reflection.Emit.ILGeneration": "4.0.1", "System.Reflection.Emit.Lightweight": "4.0.1", "System.Reflection.Extensions": "4.0.1", "System.Reflection.Primitives": "4.0.1", "System.Reflection.TypeExtensions": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Threading": "4.0.11" }, "compile": { "ref/netstandard1.6/System.Linq.Expressions.dll": {} }, "runtime": { "lib/netstandard1.6/System.Linq.Expressions.dll": {} } }, "System.Net.Http/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Diagnostics.DiagnosticSource": "4.0.0", "System.Diagnostics.Tracing": "4.1.0", "System.Globalization": "4.0.11", "System.Globalization.Extensions": "4.0.1", "System.IO": "4.1.0", "System.IO.FileSystem": "4.0.1", "System.Net.Primitives": "4.0.11", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Runtime.InteropServices": "4.1.0", "System.Security.Cryptography.Algorithms": "4.2.0", "System.Security.Cryptography.Encoding": "4.0.0", "System.Security.Cryptography.OpenSsl": "4.0.0", "System.Security.Cryptography.Primitives": "4.0.0", "System.Security.Cryptography.X509Certificates": "4.1.0", "System.Text.Encoding": "4.0.11", "System.Threading": "4.0.11", "System.Threading.Tasks": "4.0.11", "runtime.native.System": "4.0.0", "runtime.native.System.Net.Http": "4.0.1", "runtime.native.System.Security.Cryptography": "4.0.0" }, "compile": { "ref/netstandard1.3/System.Net.Http.dll": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.6/System.Net.Http.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Net.Http.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Net.Primitives/4.0.11": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0", "System.Runtime.Handles": "4.0.1" }, "compile": { "ref/netstandard1.3/System.Net.Primitives.dll": {} } }, "System.Net.Sockets/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.IO": "4.1.0", "System.Net.Primitives": "4.0.11", "System.Runtime": "4.1.0", "System.Threading.Tasks": "4.0.11" }, "compile": { "ref/netstandard1.3/System.Net.Sockets.dll": {} } }, "System.ObjectModel/4.0.12": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Threading": "4.0.11" }, "compile": { "ref/netstandard1.3/System.ObjectModel.dll": {} }, "runtime": { "lib/netstandard1.3/System.ObjectModel.dll": {} } }, "System.Reflection/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.IO": "4.1.0", "System.Reflection.Primitives": "4.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.5/System.Reflection.dll": {} } }, "System.Reflection.Emit/4.0.1": { "type": "package", "dependencies": { "System.IO": "4.1.0", "System.Reflection": "4.1.0", "System.Reflection.Emit.ILGeneration": "4.0.1", "System.Reflection.Primitives": "4.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.1/_._": {} }, "runtime": { "lib/netstandard1.3/System.Reflection.Emit.dll": {} } }, "System.Reflection.Emit.ILGeneration/4.0.1": { "type": "package", "dependencies": { "System.Reflection": "4.1.0", "System.Reflection.Primitives": "4.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll": {} } }, "System.Reflection.Emit.Lightweight/4.0.1": { "type": "package", "dependencies": { "System.Reflection": "4.1.0", "System.Reflection.Emit.ILGeneration": "4.0.1", "System.Reflection.Primitives": "4.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll": {} } }, "System.Reflection.Extensions/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Reflection": "4.1.0", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.0/System.Reflection.Extensions.dll": {} } }, "System.Reflection.Primitives/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.0/System.Reflection.Primitives.dll": {} } }, "System.Reflection.TypeExtensions/4.1.0": { "type": "package", "dependencies": { "System.Reflection": "4.1.0", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.5/_._": {} }, "runtime": { "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} } }, "System.Resources.ResourceManager/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Globalization": "4.0.11", "System.Reflection": "4.1.0", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.0/System.Resources.ResourceManager.dll": {} } }, "System.Runtime/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1" }, "compile": { "ref/netstandard1.5/System.Runtime.dll": {} } }, "System.Runtime.Extensions/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.5/System.Runtime.Extensions.dll": {} } }, "System.Runtime.Handles/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Handles.dll": {} } }, "System.Runtime.InteropServices/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Reflection": "4.1.0", "System.Reflection.Primitives": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Handles": "4.0.1" }, "compile": { "ref/netstandard1.5/System.Runtime.InteropServices.dll": {} } }, "System.Runtime.InteropServices.RuntimeInformation/4.0.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "System.Reflection": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.InteropServices": "4.1.0", "System.Threading": "4.0.11", "runtime.native.System": "4.0.0" }, "compile": { "ref/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Runtime.Numerics/4.0.1": { "type": "package", "dependencies": { "System.Globalization": "4.0.11", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0" }, "compile": { "ref/netstandard1.1/System.Runtime.Numerics.dll": {} }, "runtime": { "lib/netstandard1.3/System.Runtime.Numerics.dll": {} } }, "System.Runtime.Serialization.Primitives/4.1.1": { "type": "package", "dependencies": { "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/System.Runtime.Serialization.Primitives.dll": {} }, "runtime": { "lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll": {} } }, "System.Security.Cryptography.Algorithms/4.2.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "System.Collections": "4.0.11", "System.IO": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Runtime.InteropServices": "4.1.0", "System.Runtime.Numerics": "4.0.1", "System.Security.Cryptography.Encoding": "4.0.0", "System.Security.Cryptography.Primitives": "4.0.0", "System.Text.Encoding": "4.0.11", "runtime.native.System.Security.Cryptography": "4.0.0" }, "compile": { "ref/netstandard1.6/System.Security.Cryptography.Algorithms.dll": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Security.Cryptography.Cng/4.2.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "System.IO": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Runtime.InteropServices": "4.1.0", "System.Security.Cryptography.Algorithms": "4.2.0", "System.Security.Cryptography.Encoding": "4.0.0", "System.Security.Cryptography.Primitives": "4.0.0", "System.Text.Encoding": "4.0.11" }, "compile": { "ref/netstandard1.6/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Cng.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Security.Cryptography.Csp/4.0.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "System.IO": "4.1.0", "System.Reflection": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Runtime.InteropServices": "4.1.0", "System.Security.Cryptography.Algorithms": "4.2.0", "System.Security.Cryptography.Encoding": "4.0.0", "System.Security.Cryptography.Primitives": "4.0.0", "System.Text.Encoding": "4.0.11", "System.Threading": "4.0.11" }, "compile": { "ref/netstandard1.3/_._": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Csp.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Csp.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Security.Cryptography.Encoding/4.0.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "System.Collections": "4.0.11", "System.Collections.Concurrent": "4.0.12", "System.Linq": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Runtime.InteropServices": "4.1.0", "System.Security.Cryptography.Primitives": "4.0.0", "System.Text.Encoding": "4.0.11", "runtime.native.System.Security.Cryptography": "4.0.0" }, "compile": { "ref/netstandard1.3/System.Security.Cryptography.Encoding.dll": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Security.Cryptography.OpenSsl/4.0.0": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.IO": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Runtime.InteropServices": "4.1.0", "System.Runtime.Numerics": "4.0.1", "System.Security.Cryptography.Algorithms": "4.2.0", "System.Security.Cryptography.Encoding": "4.0.0", "System.Security.Cryptography.Primitives": "4.0.0", "System.Text.Encoding": "4.0.11", "runtime.native.System.Security.Cryptography": "4.0.0" }, "compile": { "ref/netstandard1.6/_._": {} }, "runtime": { "lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll": { "assetType": "runtime", "rid": "unix" } } }, "System.Security.Cryptography.Primitives/4.0.0": { "type": "package", "dependencies": { "System.Diagnostics.Debug": "4.0.11", "System.Globalization": "4.0.11", "System.IO": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Threading": "4.0.11", "System.Threading.Tasks": "4.0.11" }, "compile": { "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll": {} }, "runtime": { "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll": {} } }, "System.Security.Cryptography.X509Certificates/4.1.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Globalization": "4.0.11", "System.Globalization.Calendars": "4.0.1", "System.IO": "4.1.0", "System.IO.FileSystem": "4.0.1", "System.IO.FileSystem.Primitives": "4.0.1", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.Handles": "4.0.1", "System.Runtime.InteropServices": "4.1.0", "System.Runtime.Numerics": "4.0.1", "System.Security.Cryptography.Algorithms": "4.2.0", "System.Security.Cryptography.Cng": "4.2.0", "System.Security.Cryptography.Csp": "4.0.0", "System.Security.Cryptography.Encoding": "4.0.0", "System.Security.Cryptography.OpenSsl": "4.0.0", "System.Security.Cryptography.Primitives": "4.0.0", "System.Text.Encoding": "4.0.11", "System.Threading": "4.0.11", "runtime.native.System": "4.0.0", "runtime.native.System.Net.Http": "4.0.1", "runtime.native.System.Security.Cryptography": "4.0.0" }, "compile": { "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll": {} }, "runtimeTargets": { "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": { "assetType": "runtime", "rid": "unix" }, "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": { "assetType": "runtime", "rid": "win" } } }, "System.Text.Encoding/4.0.11": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.dll": {} } }, "System.Text.Encoding.Extensions/4.0.11": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0", "System.Text.Encoding": "4.0.11" }, "compile": { "ref/netstandard1.3/System.Text.Encoding.Extensions.dll": {} } }, "System.Text.RegularExpressions/4.1.0": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Globalization": "4.0.11", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Threading": "4.0.11" }, "compile": { "ref/netstandard1.6/System.Text.RegularExpressions.dll": {} }, "runtime": { "lib/netstandard1.6/System.Text.RegularExpressions.dll": {} } }, "System.Threading/4.0.11": { "type": "package", "dependencies": { "System.Runtime": "4.1.0", "System.Threading.Tasks": "4.0.11" }, "compile": { "ref/netstandard1.3/System.Threading.dll": {} }, "runtime": { "lib/netstandard1.3/System.Threading.dll": {} } }, "System.Threading.Tasks/4.0.11": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.3/System.Threading.Tasks.dll": {} } }, "System.Threading.Tasks.Extensions/4.0.0": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Runtime": "4.1.0", "System.Threading.Tasks": "4.0.11" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll": {} } }, "System.Threading.Timer/4.0.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1", "Microsoft.NETCore.Targets": "1.0.1", "System.Runtime": "4.1.0" }, "compile": { "ref/netstandard1.2/System.Threading.Timer.dll": {} } }, "System.Xml.ReaderWriter/4.0.11": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Globalization": "4.0.11", "System.IO": "4.1.0", "System.IO.FileSystem": "4.0.1", "System.IO.FileSystem.Primitives": "4.0.1", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Runtime.InteropServices": "4.1.0", "System.Text.Encoding": "4.0.11", "System.Text.Encoding.Extensions": "4.0.11", "System.Text.RegularExpressions": "4.1.0", "System.Threading.Tasks": "4.0.11", "System.Threading.Tasks.Extensions": "4.0.0" }, "compile": { "ref/netstandard1.3/System.Xml.ReaderWriter.dll": {} }, "runtime": { "lib/netstandard1.3/System.Xml.ReaderWriter.dll": {} } }, "System.Xml.XDocument/4.0.11": { "type": "package", "dependencies": { "System.Collections": "4.0.11", "System.Diagnostics.Debug": "4.0.11", "System.Diagnostics.Tools": "4.0.1", "System.Globalization": "4.0.11", "System.IO": "4.1.0", "System.Reflection": "4.1.0", "System.Resources.ResourceManager": "4.0.1", "System.Runtime": "4.1.0", "System.Runtime.Extensions": "4.1.0", "System.Text.Encoding": "4.0.11", "System.Threading": "4.0.11", "System.Xml.ReaderWriter": "4.0.11" }, "compile": { "ref/netstandard1.3/System.Xml.XDocument.dll": {} }, "runtime": { "lib/netstandard1.3/System.Xml.XDocument.dll": {} } } } }, "libraries": { "Microsoft.CSharp/4.0.1": { "sha512": "cjnk5GNoivyDA+bLhtQ1C4OxdnCDF4/0jPZBjt4oxABBXSVqlo9OWBHHoLKLSfdA/XGVWUhLm8IT62nbPrfx3w==", "type": "package", "path": "Microsoft.CSharp/4.0.1", "files": [ "Microsoft.CSharp.4.0.1.nupkg.sha512", "Microsoft.CSharp.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/Microsoft.CSharp.dll", "lib/netstandard1.3/Microsoft.CSharp.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/Microsoft.CSharp.dll", "ref/netcore50/Microsoft.CSharp.xml", "ref/netcore50/de/Microsoft.CSharp.xml", "ref/netcore50/es/Microsoft.CSharp.xml", "ref/netcore50/fr/Microsoft.CSharp.xml", "ref/netcore50/it/Microsoft.CSharp.xml", "ref/netcore50/ja/Microsoft.CSharp.xml", "ref/netcore50/ko/Microsoft.CSharp.xml", "ref/netcore50/ru/Microsoft.CSharp.xml", "ref/netcore50/zh-hans/Microsoft.CSharp.xml", "ref/netcore50/zh-hant/Microsoft.CSharp.xml", "ref/netstandard1.0/Microsoft.CSharp.dll", "ref/netstandard1.0/Microsoft.CSharp.xml", "ref/netstandard1.0/de/Microsoft.CSharp.xml", "ref/netstandard1.0/es/Microsoft.CSharp.xml", "ref/netstandard1.0/fr/Microsoft.CSharp.xml", "ref/netstandard1.0/it/Microsoft.CSharp.xml", "ref/netstandard1.0/ja/Microsoft.CSharp.xml", "ref/netstandard1.0/ko/Microsoft.CSharp.xml", "ref/netstandard1.0/ru/Microsoft.CSharp.xml", "ref/netstandard1.0/zh-hans/Microsoft.CSharp.xml", "ref/netstandard1.0/zh-hant/Microsoft.CSharp.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "Microsoft.NETCore.Platforms/1.0.1": { "sha512": "MckX8mZraSfkhdJrBNI9vGfjAVre6ZndTUQ41YqJQEftZbud9XDoa7dYyRkFOPlekag+UZvuTp0VGoeEFhF9kA==", "type": "package", "path": "Microsoft.NETCore.Platforms/1.0.1", "files": [ "Microsoft.NETCore.Platforms.1.0.1.nupkg.sha512", "Microsoft.NETCore.Platforms.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.json" ] }, "Microsoft.NETCore.Targets/1.0.1": { "sha512": "wh5c7Jtadh5Pq8CIH31SU/fQWmR+Qa+TSQN3bR/NuMbE/8gQd9x6aiV8twY34RC9xuJ69u2tTLtIM/GMQp8D8A==", "type": "package", "path": "Microsoft.NETCore.Targets/1.0.1", "files": [ "Microsoft.NETCore.Targets.1.0.1.nupkg.sha512", "Microsoft.NETCore.Targets.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.json" ] }, "Microsoft.Win32.Primitives/4.0.1": { "sha512": "wTQ2FbDa8hvoTS/CFc5qAu1Bnx9EAJenKa6NNd4rNgeojgy6gkIKpVQWVC6A//Fg2qpL5Q2Fi4ekhhJd956QVQ==", "type": "package", "path": "Microsoft.Win32.Primitives/4.0.1", "files": [ "Microsoft.Win32.Primitives.4.0.1.nupkg.sha512", "Microsoft.Win32.Primitives.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/Microsoft.Win32.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.dll", "ref/netstandard1.3/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml", "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "NETStandard.Library/1.6.0": { "sha512": "vw4kjupPp6A5m6koi0aM9+/rNXPfChlC0I9N/prKOL7oppr/nvIzx/NasYioxnj6eE1R3Nr9ilTympaYWV1Hzg==", "type": "package", "path": "NETStandard.Library/1.6.0", "files": [ "NETStandard.Library.1.6.0.nupkg.sha512", "NETStandard.Library.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt" ] }, "Newtonsoft.Json/9.0.1": { "sha512": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", "type": "package", "path": "Newtonsoft.Json/9.0.1", "files": [ "Newtonsoft.Json.9.0.1.nupkg.sha512", "Newtonsoft.Json.nuspec", "lib/net20/Newtonsoft.Json.dll", "lib/net20/Newtonsoft.Json.xml", "lib/net35/Newtonsoft.Json.dll", "lib/net35/Newtonsoft.Json.xml", "lib/net40/Newtonsoft.Json.dll", "lib/net40/Newtonsoft.Json.xml", "lib/net45/Newtonsoft.Json.dll", "lib/net45/Newtonsoft.Json.xml", "lib/netstandard1.0/Newtonsoft.Json.dll", "lib/netstandard1.0/Newtonsoft.Json.xml", "lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.dll", "lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.xml", "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll", "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.xml", "tools/install.ps1" ] }, "runtime.native.System/4.0.0": { "sha512": "zg/NbMRugSd2+UQATSJS+coPQjVQlIwsHWqCx9yX7gLRsYJDM84JNGw9NUQtSRLo86mgNp8kGDxGDnyJqArxlw==", "type": "package", "path": "runtime.native.System/4.0.0", "files": [ "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.System.4.0.0.nupkg.sha512", "runtime.native.System.nuspec" ] }, "runtime.native.System.IO.Compression/4.1.0": { "sha512": "xMXP/JH9nX2uA2gQmausAX3WrSyM9K7Cw/LTXnHX2YwQPl2ItFA4x5VJbYtrYiLDvFrLJrICXH6OpSNQRpUamg==", "type": "package", "path": "runtime.native.System.IO.Compression/4.1.0", "files": [ "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.System.IO.Compression.4.1.0.nupkg.sha512", "runtime.native.System.IO.Compression.nuspec" ] }, "runtime.native.System.Net.Http/4.0.1": { "sha512": "0Kyk4d1689s9APzmAydtccI+l3aG26W2z6z1qazRVP9XZxcpEsEbWiMuYIAP6m4RDaei7jduZOdtidNFGE2oJQ==", "type": "package", "path": "runtime.native.System.Net.Http/4.0.1", "files": [ "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.System.Net.Http.4.0.1.nupkg.sha512", "runtime.native.System.Net.Http.nuspec" ] }, "runtime.native.System.Security.Cryptography/4.0.0": { "sha512": "Ao+u1dJYA36RCX2cJdsYKHnNXWf777rWxNE6DWJKM3oJfvtnfDa37hYKzQwFRSDxboqUFE0XetaJV41R/GZXkg==", "type": "package", "path": "runtime.native.System.Security.Cryptography/4.0.0", "files": [ "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/_._", "runtime.native.System.Security.Cryptography.4.0.0.nupkg.sha512", "runtime.native.System.Security.Cryptography.nuspec" ] }, "System.AppContext/4.1.0": { "sha512": "T9cj9RKt8/je4uKRjgB+uMY4FaiISCWQ57JY7U0L3N8pOm3vNNoDBv23gcRjHJouB34pclRHLp7nd0yjz5oppQ==", "type": "package", "path": "System.AppContext/4.1.0", "files": [ "System.AppContext.4.1.0.nupkg.sha512", "System.AppContext.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.AppContext.dll", "lib/net463/System.AppContext.dll", "lib/netcore50/System.AppContext.dll", "lib/netstandard1.6/System.AppContext.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.AppContext.dll", "ref/net463/System.AppContext.dll", "ref/netstandard/_._", "ref/netstandard1.3/System.AppContext.dll", "ref/netstandard1.3/System.AppContext.xml", "ref/netstandard1.3/de/System.AppContext.xml", "ref/netstandard1.3/es/System.AppContext.xml", "ref/netstandard1.3/fr/System.AppContext.xml", "ref/netstandard1.3/it/System.AppContext.xml", "ref/netstandard1.3/ja/System.AppContext.xml", "ref/netstandard1.3/ko/System.AppContext.xml", "ref/netstandard1.3/ru/System.AppContext.xml", "ref/netstandard1.3/zh-hans/System.AppContext.xml", "ref/netstandard1.3/zh-hant/System.AppContext.xml", "ref/netstandard1.6/System.AppContext.dll", "ref/netstandard1.6/System.AppContext.xml", "ref/netstandard1.6/de/System.AppContext.xml", "ref/netstandard1.6/es/System.AppContext.xml", "ref/netstandard1.6/fr/System.AppContext.xml", "ref/netstandard1.6/it/System.AppContext.xml", "ref/netstandard1.6/ja/System.AppContext.xml", "ref/netstandard1.6/ko/System.AppContext.xml", "ref/netstandard1.6/ru/System.AppContext.xml", "ref/netstandard1.6/zh-hans/System.AppContext.xml", "ref/netstandard1.6/zh-hant/System.AppContext.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.AppContext.dll" ] }, "System.Buffers/4.0.0": { "sha512": "XL/OWDhDy7gQfDhVi6FXsdUBuaJ9ypyxN0YmEq5qqL9Z61t5LntMlJl7ncHA++kO3NFTwtJ/AYzucBEYUy2XUA==", "type": "package", "path": "System.Buffers/4.0.0", "files": [ "System.Buffers.4.0.0.nupkg.sha512", "System.Buffers.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.1/.xml", "lib/netstandard1.1/System.Buffers.dll" ] }, "System.Collections/4.0.11": { "sha512": "SuPicHuwVYJI7bYj2CmhUOUAtGipgG7XJNANrbSY0+HH14b07uF1+dYUIq60XGecq6wi6Oefvab0GX2sZMq7kQ==", "type": "package", "path": "System.Collections/4.0.11", "files": [ "System.Collections.4.0.11.nupkg.sha512", "System.Collections.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Collections.dll", "ref/netcore50/System.Collections.xml", "ref/netcore50/de/System.Collections.xml", "ref/netcore50/es/System.Collections.xml", "ref/netcore50/fr/System.Collections.xml", "ref/netcore50/it/System.Collections.xml", "ref/netcore50/ja/System.Collections.xml", "ref/netcore50/ko/System.Collections.xml", "ref/netcore50/ru/System.Collections.xml", "ref/netcore50/zh-hans/System.Collections.xml", "ref/netcore50/zh-hant/System.Collections.xml", "ref/netstandard1.0/System.Collections.dll", "ref/netstandard1.0/System.Collections.xml", "ref/netstandard1.0/de/System.Collections.xml", "ref/netstandard1.0/es/System.Collections.xml", "ref/netstandard1.0/fr/System.Collections.xml", "ref/netstandard1.0/it/System.Collections.xml", "ref/netstandard1.0/ja/System.Collections.xml", "ref/netstandard1.0/ko/System.Collections.xml", "ref/netstandard1.0/ru/System.Collections.xml", "ref/netstandard1.0/zh-hans/System.Collections.xml", "ref/netstandard1.0/zh-hant/System.Collections.xml", "ref/netstandard1.3/System.Collections.dll", "ref/netstandard1.3/System.Collections.xml", "ref/netstandard1.3/de/System.Collections.xml", "ref/netstandard1.3/es/System.Collections.xml", "ref/netstandard1.3/fr/System.Collections.xml", "ref/netstandard1.3/it/System.Collections.xml", "ref/netstandard1.3/ja/System.Collections.xml", "ref/netstandard1.3/ko/System.Collections.xml", "ref/netstandard1.3/ru/System.Collections.xml", "ref/netstandard1.3/zh-hans/System.Collections.xml", "ref/netstandard1.3/zh-hant/System.Collections.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Collections.Concurrent/4.0.12": { "sha512": "XFZaWGYuNyDQfZ/HomndlipMX0c8Lib3zV5CncHHx9+gj8hAP/uREd/iEPiWqatgU4iBau1BkVjOYx/K+qdUsA==", "type": "package", "path": "System.Collections.Concurrent/4.0.12", "files": [ "System.Collections.Concurrent.4.0.12.nupkg.sha512", "System.Collections.Concurrent.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Collections.Concurrent.dll", "lib/netstandard1.3/System.Collections.Concurrent.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Collections.Concurrent.dll", "ref/netcore50/System.Collections.Concurrent.xml", "ref/netcore50/de/System.Collections.Concurrent.xml", "ref/netcore50/es/System.Collections.Concurrent.xml", "ref/netcore50/fr/System.Collections.Concurrent.xml", "ref/netcore50/it/System.Collections.Concurrent.xml", "ref/netcore50/ja/System.Collections.Concurrent.xml", "ref/netcore50/ko/System.Collections.Concurrent.xml", "ref/netcore50/ru/System.Collections.Concurrent.xml", "ref/netcore50/zh-hans/System.Collections.Concurrent.xml", "ref/netcore50/zh-hant/System.Collections.Concurrent.xml", "ref/netstandard1.1/System.Collections.Concurrent.dll", "ref/netstandard1.1/System.Collections.Concurrent.xml", "ref/netstandard1.1/de/System.Collections.Concurrent.xml", "ref/netstandard1.1/es/System.Collections.Concurrent.xml", "ref/netstandard1.1/fr/System.Collections.Concurrent.xml", "ref/netstandard1.1/it/System.Collections.Concurrent.xml", "ref/netstandard1.1/ja/System.Collections.Concurrent.xml", "ref/netstandard1.1/ko/System.Collections.Concurrent.xml", "ref/netstandard1.1/ru/System.Collections.Concurrent.xml", "ref/netstandard1.1/zh-hans/System.Collections.Concurrent.xml", "ref/netstandard1.1/zh-hant/System.Collections.Concurrent.xml", "ref/netstandard1.3/System.Collections.Concurrent.dll", "ref/netstandard1.3/System.Collections.Concurrent.xml", "ref/netstandard1.3/de/System.Collections.Concurrent.xml", "ref/netstandard1.3/es/System.Collections.Concurrent.xml", "ref/netstandard1.3/fr/System.Collections.Concurrent.xml", "ref/netstandard1.3/it/System.Collections.Concurrent.xml", "ref/netstandard1.3/ja/System.Collections.Concurrent.xml", "ref/netstandard1.3/ko/System.Collections.Concurrent.xml", "ref/netstandard1.3/ru/System.Collections.Concurrent.xml", "ref/netstandard1.3/zh-hans/System.Collections.Concurrent.xml", "ref/netstandard1.3/zh-hant/System.Collections.Concurrent.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Console/4.0.0": { "sha512": "BLt4LWLDFoSl9QrTIyaAFNf5D25Cr+uMNw22Hb9p27Z7qg93ZkdoZyfXlSchszNq7bqQaYufV8GhM13j6dJhcw==", "type": "package", "path": "System.Console/4.0.0", "files": [ "System.Console.4.0.0.nupkg.sha512", "System.Console.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Console.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Console.dll", "ref/netstandard1.3/System.Console.dll", "ref/netstandard1.3/System.Console.xml", "ref/netstandard1.3/de/System.Console.xml", "ref/netstandard1.3/es/System.Console.xml", "ref/netstandard1.3/fr/System.Console.xml", "ref/netstandard1.3/it/System.Console.xml", "ref/netstandard1.3/ja/System.Console.xml", "ref/netstandard1.3/ko/System.Console.xml", "ref/netstandard1.3/ru/System.Console.xml", "ref/netstandard1.3/zh-hans/System.Console.xml", "ref/netstandard1.3/zh-hant/System.Console.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Diagnostics.Debug/4.0.11": { "sha512": "3ZLx/Q8De4QDNAnqnJbw3gr3iPU1LkxP3zB80jFZOaRm8gbsQ+Bo6xEzQgTEt7dH/WVrlhHZBU90sJgZNgxvfg==", "type": "package", "path": "System.Diagnostics.Debug/4.0.11", "files": [ "System.Diagnostics.Debug.4.0.11.nupkg.sha512", "System.Diagnostics.Debug.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Diagnostics.Debug.dll", "ref/netcore50/System.Diagnostics.Debug.xml", "ref/netcore50/de/System.Diagnostics.Debug.xml", "ref/netcore50/es/System.Diagnostics.Debug.xml", "ref/netcore50/fr/System.Diagnostics.Debug.xml", "ref/netcore50/it/System.Diagnostics.Debug.xml", "ref/netcore50/ja/System.Diagnostics.Debug.xml", "ref/netcore50/ko/System.Diagnostics.Debug.xml", "ref/netcore50/ru/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml", "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.0/System.Diagnostics.Debug.dll", "ref/netstandard1.0/System.Diagnostics.Debug.xml", "ref/netstandard1.0/de/System.Diagnostics.Debug.xml", "ref/netstandard1.0/es/System.Diagnostics.Debug.xml", "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.0/it/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml", "ref/netstandard1.3/System.Diagnostics.Debug.dll", "ref/netstandard1.3/System.Diagnostics.Debug.xml", "ref/netstandard1.3/de/System.Diagnostics.Debug.xml", "ref/netstandard1.3/es/System.Diagnostics.Debug.xml", "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml", "ref/netstandard1.3/it/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml", "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Diagnostics.DiagnosticSource/4.0.0": { "sha512": "1bNILdvNdzrTryYN0/4635W0bDld4wZhqbrmooZ0Un41eU2f6RBDfCmKYXsllPKq9jP63vIoB11g3AB7uwXGyQ==", "type": "package", "path": "System.Diagnostics.DiagnosticSource/4.0.0", "files": [ "System.Diagnostics.DiagnosticSource.4.0.0.nupkg.sha512", "System.Diagnostics.DiagnosticSource.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Diagnostics.DiagnosticSource.dll", "lib/net46/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll", "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml" ] }, "System.Diagnostics.Tools/4.0.1": { "sha512": "YlnvA9Bpb/pDyhNodufGBD0Cr9Xwf+yBZlSYUUWbkosLjJYVWL9O0KeXh6/TIJsVHkrKbWnaMifdiiUwSDXJVQ==", "type": "package", "path": "System.Diagnostics.Tools/4.0.1", "files": [ "System.Diagnostics.Tools.4.0.1.nupkg.sha512", "System.Diagnostics.Tools.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Diagnostics.Tools.dll", "ref/netcore50/System.Diagnostics.Tools.xml", "ref/netcore50/de/System.Diagnostics.Tools.xml", "ref/netcore50/es/System.Diagnostics.Tools.xml", "ref/netcore50/fr/System.Diagnostics.Tools.xml", "ref/netcore50/it/System.Diagnostics.Tools.xml", "ref/netcore50/ja/System.Diagnostics.Tools.xml", "ref/netcore50/ko/System.Diagnostics.Tools.xml", "ref/netcore50/ru/System.Diagnostics.Tools.xml", "ref/netcore50/zh-hans/System.Diagnostics.Tools.xml", "ref/netcore50/zh-hant/System.Diagnostics.Tools.xml", "ref/netstandard1.0/System.Diagnostics.Tools.dll", "ref/netstandard1.0/System.Diagnostics.Tools.xml", "ref/netstandard1.0/de/System.Diagnostics.Tools.xml", "ref/netstandard1.0/es/System.Diagnostics.Tools.xml", "ref/netstandard1.0/fr/System.Diagnostics.Tools.xml", "ref/netstandard1.0/it/System.Diagnostics.Tools.xml", "ref/netstandard1.0/ja/System.Diagnostics.Tools.xml", "ref/netstandard1.0/ko/System.Diagnostics.Tools.xml", "ref/netstandard1.0/ru/System.Diagnostics.Tools.xml", "ref/netstandard1.0/zh-hans/System.Diagnostics.Tools.xml", "ref/netstandard1.0/zh-hant/System.Diagnostics.Tools.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Diagnostics.Tracing/4.1.0": { "sha512": "Vuc4OM2vnTNkxtyLKP4ysBHscmzPVrB6gv6jm9GfdlmiuKHtwM4OyRVOoEg7ENqqNg7S354EYMdUbmAidEw2dA==", "type": "package", "path": "System.Diagnostics.Tracing/4.1.0", "files": [ "System.Diagnostics.Tracing.4.1.0.nupkg.sha512", "System.Diagnostics.Tracing.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Diagnostics.Tracing.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.dll", "ref/netcore50/System.Diagnostics.Tracing.xml", "ref/netcore50/de/System.Diagnostics.Tracing.xml", "ref/netcore50/es/System.Diagnostics.Tracing.xml", "ref/netcore50/fr/System.Diagnostics.Tracing.xml", "ref/netcore50/it/System.Diagnostics.Tracing.xml", "ref/netcore50/ja/System.Diagnostics.Tracing.xml", "ref/netcore50/ko/System.Diagnostics.Tracing.xml", "ref/netcore50/ru/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml", "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/System.Diagnostics.Tracing.dll", "ref/netstandard1.1/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/System.Diagnostics.Tracing.dll", "ref/netstandard1.2/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/System.Diagnostics.Tracing.dll", "ref/netstandard1.3/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/System.Diagnostics.Tracing.dll", "ref/netstandard1.5/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml", "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Dynamic.Runtime/4.0.11": { "sha512": "mo6l33TjqA/xuRtbCEcbNL/VCn4JMPoB+bTbQ54LkRAJTXa58GfGM7FG9iKYGpTZuCFph9vb1/KXwiNwKN7AJw==", "type": "package", "path": "System.Dynamic.Runtime/4.0.11", "files": [ "System.Dynamic.Runtime.4.0.11.nupkg.sha512", "System.Dynamic.Runtime.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Dynamic.Runtime.dll", "lib/netstandard1.3/System.Dynamic.Runtime.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Dynamic.Runtime.dll", "ref/netcore50/System.Dynamic.Runtime.xml", "ref/netcore50/de/System.Dynamic.Runtime.xml", "ref/netcore50/es/System.Dynamic.Runtime.xml", "ref/netcore50/fr/System.Dynamic.Runtime.xml", "ref/netcore50/it/System.Dynamic.Runtime.xml", "ref/netcore50/ja/System.Dynamic.Runtime.xml", "ref/netcore50/ko/System.Dynamic.Runtime.xml", "ref/netcore50/ru/System.Dynamic.Runtime.xml", "ref/netcore50/zh-hans/System.Dynamic.Runtime.xml", "ref/netcore50/zh-hant/System.Dynamic.Runtime.xml", "ref/netstandard1.0/System.Dynamic.Runtime.dll", "ref/netstandard1.0/System.Dynamic.Runtime.xml", "ref/netstandard1.0/de/System.Dynamic.Runtime.xml", "ref/netstandard1.0/es/System.Dynamic.Runtime.xml", "ref/netstandard1.0/fr/System.Dynamic.Runtime.xml", "ref/netstandard1.0/it/System.Dynamic.Runtime.xml", "ref/netstandard1.0/ja/System.Dynamic.Runtime.xml", "ref/netstandard1.0/ko/System.Dynamic.Runtime.xml", "ref/netstandard1.0/ru/System.Dynamic.Runtime.xml", "ref/netstandard1.0/zh-hans/System.Dynamic.Runtime.xml", "ref/netstandard1.0/zh-hant/System.Dynamic.Runtime.xml", "ref/netstandard1.3/System.Dynamic.Runtime.dll", "ref/netstandard1.3/System.Dynamic.Runtime.xml", "ref/netstandard1.3/de/System.Dynamic.Runtime.xml", "ref/netstandard1.3/es/System.Dynamic.Runtime.xml", "ref/netstandard1.3/fr/System.Dynamic.Runtime.xml", "ref/netstandard1.3/it/System.Dynamic.Runtime.xml", "ref/netstandard1.3/ja/System.Dynamic.Runtime.xml", "ref/netstandard1.3/ko/System.Dynamic.Runtime.xml", "ref/netstandard1.3/ru/System.Dynamic.Runtime.xml", "ref/netstandard1.3/zh-hans/System.Dynamic.Runtime.xml", "ref/netstandard1.3/zh-hant/System.Dynamic.Runtime.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Dynamic.Runtime.dll" ] }, "System.Globalization/4.0.11": { "sha512": "dlkZ6jJ6rt9Yj/uGBB7drvBWqZ94ErztOllgVRz3UeqMGPnVCUWEA5cq2OZ5sMdQvl8+rJjFE0z8dalnv8wVRA==", "type": "package", "path": "System.Globalization/4.0.11", "files": [ "System.Globalization.4.0.11.nupkg.sha512", "System.Globalization.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Globalization.dll", "ref/netcore50/System.Globalization.xml", "ref/netcore50/de/System.Globalization.xml", "ref/netcore50/es/System.Globalization.xml", "ref/netcore50/fr/System.Globalization.xml", "ref/netcore50/it/System.Globalization.xml", "ref/netcore50/ja/System.Globalization.xml", "ref/netcore50/ko/System.Globalization.xml", "ref/netcore50/ru/System.Globalization.xml", "ref/netcore50/zh-hans/System.Globalization.xml", "ref/netcore50/zh-hant/System.Globalization.xml", "ref/netstandard1.0/System.Globalization.dll", "ref/netstandard1.0/System.Globalization.xml", "ref/netstandard1.0/de/System.Globalization.xml", "ref/netstandard1.0/es/System.Globalization.xml", "ref/netstandard1.0/fr/System.Globalization.xml", "ref/netstandard1.0/it/System.Globalization.xml", "ref/netstandard1.0/ja/System.Globalization.xml", "ref/netstandard1.0/ko/System.Globalization.xml", "ref/netstandard1.0/ru/System.Globalization.xml", "ref/netstandard1.0/zh-hans/System.Globalization.xml", "ref/netstandard1.0/zh-hant/System.Globalization.xml", "ref/netstandard1.3/System.Globalization.dll", "ref/netstandard1.3/System.Globalization.xml", "ref/netstandard1.3/de/System.Globalization.xml", "ref/netstandard1.3/es/System.Globalization.xml", "ref/netstandard1.3/fr/System.Globalization.xml", "ref/netstandard1.3/it/System.Globalization.xml", "ref/netstandard1.3/ja/System.Globalization.xml", "ref/netstandard1.3/ko/System.Globalization.xml", "ref/netstandard1.3/ru/System.Globalization.xml", "ref/netstandard1.3/zh-hans/System.Globalization.xml", "ref/netstandard1.3/zh-hant/System.Globalization.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Globalization.Calendars/4.0.1": { "sha512": "962x899y6gBQaFylMYAcWGPXiJmPIPN7415XtbTPNG/+TdcDhBUsWZVmPLjECxbRjDQsR+nNFHoQWSP3We43vg==", "type": "package", "path": "System.Globalization.Calendars/4.0.1", "files": [ "System.Globalization.Calendars.4.0.1.nupkg.sha512", "System.Globalization.Calendars.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Globalization.Calendars.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Globalization.Calendars.dll", "ref/netstandard1.3/System.Globalization.Calendars.dll", "ref/netstandard1.3/System.Globalization.Calendars.xml", "ref/netstandard1.3/de/System.Globalization.Calendars.xml", "ref/netstandard1.3/es/System.Globalization.Calendars.xml", "ref/netstandard1.3/fr/System.Globalization.Calendars.xml", "ref/netstandard1.3/it/System.Globalization.Calendars.xml", "ref/netstandard1.3/ja/System.Globalization.Calendars.xml", "ref/netstandard1.3/ko/System.Globalization.Calendars.xml", "ref/netstandard1.3/ru/System.Globalization.Calendars.xml", "ref/netstandard1.3/zh-hans/System.Globalization.Calendars.xml", "ref/netstandard1.3/zh-hant/System.Globalization.Calendars.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Globalization.Extensions/4.0.1": { "sha512": "wsi5FF3HgmY3xslEkK3avLrFRf04lrQESRaIaUL9+u1CtzEPmbZFs45Sv3ASIUxpmBTxkJ6RFLrJ84FjIV19mQ==", "type": "package", "path": "System.Globalization.Extensions/4.0.1", "files": [ "System.Globalization.Extensions.4.0.1.nupkg.sha512", "System.Globalization.Extensions.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Globalization.Extensions.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Globalization.Extensions.dll", "ref/netstandard1.3/System.Globalization.Extensions.dll", "ref/netstandard1.3/System.Globalization.Extensions.xml", "ref/netstandard1.3/de/System.Globalization.Extensions.xml", "ref/netstandard1.3/es/System.Globalization.Extensions.xml", "ref/netstandard1.3/fr/System.Globalization.Extensions.xml", "ref/netstandard1.3/it/System.Globalization.Extensions.xml", "ref/netstandard1.3/ja/System.Globalization.Extensions.xml", "ref/netstandard1.3/ko/System.Globalization.Extensions.xml", "ref/netstandard1.3/ru/System.Globalization.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Globalization.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Globalization.Extensions.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.3/System.Globalization.Extensions.dll", "runtimes/win/lib/net46/System.Globalization.Extensions.dll", "runtimes/win/lib/netstandard1.3/System.Globalization.Extensions.dll" ] }, "System.IO/4.1.0": { "sha512": "aacsoGIwCqvLgWqVfYZFB8DflfLY/lzuS0GhEWtnZwi3XmZQfoxjznl7yR/Pr+vaMSxsZWLFZgU2OQDM8ESQEg==", "type": "package", "path": "System.IO/4.1.0", "files": [ "System.IO.4.1.0.nupkg.sha512", "System.IO.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.IO.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.IO.dll", "ref/netcore50/System.IO.dll", "ref/netcore50/System.IO.xml", "ref/netcore50/de/System.IO.xml", "ref/netcore50/es/System.IO.xml", "ref/netcore50/fr/System.IO.xml", "ref/netcore50/it/System.IO.xml", "ref/netcore50/ja/System.IO.xml", "ref/netcore50/ko/System.IO.xml", "ref/netcore50/ru/System.IO.xml", "ref/netcore50/zh-hans/System.IO.xml", "ref/netcore50/zh-hant/System.IO.xml", "ref/netstandard1.0/System.IO.dll", "ref/netstandard1.0/System.IO.xml", "ref/netstandard1.0/de/System.IO.xml", "ref/netstandard1.0/es/System.IO.xml", "ref/netstandard1.0/fr/System.IO.xml", "ref/netstandard1.0/it/System.IO.xml", "ref/netstandard1.0/ja/System.IO.xml", "ref/netstandard1.0/ko/System.IO.xml", "ref/netstandard1.0/ru/System.IO.xml", "ref/netstandard1.0/zh-hans/System.IO.xml", "ref/netstandard1.0/zh-hant/System.IO.xml", "ref/netstandard1.3/System.IO.dll", "ref/netstandard1.3/System.IO.xml", "ref/netstandard1.3/de/System.IO.xml", "ref/netstandard1.3/es/System.IO.xml", "ref/netstandard1.3/fr/System.IO.xml", "ref/netstandard1.3/it/System.IO.xml", "ref/netstandard1.3/ja/System.IO.xml", "ref/netstandard1.3/ko/System.IO.xml", "ref/netstandard1.3/ru/System.IO.xml", "ref/netstandard1.3/zh-hans/System.IO.xml", "ref/netstandard1.3/zh-hant/System.IO.xml", "ref/netstandard1.5/System.IO.dll", "ref/netstandard1.5/System.IO.xml", "ref/netstandard1.5/de/System.IO.xml", "ref/netstandard1.5/es/System.IO.xml", "ref/netstandard1.5/fr/System.IO.xml", "ref/netstandard1.5/it/System.IO.xml", "ref/netstandard1.5/ja/System.IO.xml", "ref/netstandard1.5/ko/System.IO.xml", "ref/netstandard1.5/ru/System.IO.xml", "ref/netstandard1.5/zh-hans/System.IO.xml", "ref/netstandard1.5/zh-hant/System.IO.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.IO.Compression/4.1.0": { "sha512": "WqC6YYuXqVlUUzw2cgWKfVadga3PayxSNe2oyDhP73V4PVPoeoRnOItFTdqskymmK1oaNwQPm7KlSy4W6pvjhg==", "type": "package", "path": "System.IO.Compression/4.1.0", "files": [ "System.IO.Compression.4.1.0.nupkg.sha512", "System.IO.Compression.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net46/System.IO.Compression.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net46/System.IO.Compression.dll", "ref/netcore50/System.IO.Compression.dll", "ref/netcore50/System.IO.Compression.xml", "ref/netcore50/de/System.IO.Compression.xml", "ref/netcore50/es/System.IO.Compression.xml", "ref/netcore50/fr/System.IO.Compression.xml", "ref/netcore50/it/System.IO.Compression.xml", "ref/netcore50/ja/System.IO.Compression.xml", "ref/netcore50/ko/System.IO.Compression.xml", "ref/netcore50/ru/System.IO.Compression.xml", "ref/netcore50/zh-hans/System.IO.Compression.xml", "ref/netcore50/zh-hant/System.IO.Compression.xml", "ref/netstandard1.1/System.IO.Compression.dll", "ref/netstandard1.1/System.IO.Compression.xml", "ref/netstandard1.1/de/System.IO.Compression.xml", "ref/netstandard1.1/es/System.IO.Compression.xml", "ref/netstandard1.1/fr/System.IO.Compression.xml", "ref/netstandard1.1/it/System.IO.Compression.xml", "ref/netstandard1.1/ja/System.IO.Compression.xml", "ref/netstandard1.1/ko/System.IO.Compression.xml", "ref/netstandard1.1/ru/System.IO.Compression.xml", "ref/netstandard1.1/zh-hans/System.IO.Compression.xml", "ref/netstandard1.1/zh-hant/System.IO.Compression.xml", "ref/netstandard1.3/System.IO.Compression.dll", "ref/netstandard1.3/System.IO.Compression.xml", "ref/netstandard1.3/de/System.IO.Compression.xml", "ref/netstandard1.3/es/System.IO.Compression.xml", "ref/netstandard1.3/fr/System.IO.Compression.xml", "ref/netstandard1.3/it/System.IO.Compression.xml", "ref/netstandard1.3/ja/System.IO.Compression.xml", "ref/netstandard1.3/ko/System.IO.Compression.xml", "ref/netstandard1.3/ru/System.IO.Compression.xml", "ref/netstandard1.3/zh-hans/System.IO.Compression.xml", "ref/netstandard1.3/zh-hant/System.IO.Compression.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll", "runtimes/win/lib/net46/System.IO.Compression.dll", "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll" ] }, "System.IO.Compression.ZipFile/4.0.1": { "sha512": "FZwxPY+FwOoQ+58COiltUzcomAPr0lcCR0tdtP8lFEeSLF/yg8Dc6Q77YGkfOP3JC1fYAvZXcctDlVgZyjP8jQ==", "type": "package", "path": "System.IO.Compression.ZipFile/4.0.1", "files": [ "System.IO.Compression.ZipFile.4.0.1.nupkg.sha512", "System.IO.Compression.ZipFile.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.Compression.ZipFile.dll", "lib/netstandard1.3/System.IO.Compression.ZipFile.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.Compression.ZipFile.dll", "ref/netstandard1.3/System.IO.Compression.ZipFile.dll", "ref/netstandard1.3/System.IO.Compression.ZipFile.xml", "ref/netstandard1.3/de/System.IO.Compression.ZipFile.xml", "ref/netstandard1.3/es/System.IO.Compression.ZipFile.xml", "ref/netstandard1.3/fr/System.IO.Compression.ZipFile.xml", "ref/netstandard1.3/it/System.IO.Compression.ZipFile.xml", "ref/netstandard1.3/ja/System.IO.Compression.ZipFile.xml", "ref/netstandard1.3/ko/System.IO.Compression.ZipFile.xml", "ref/netstandard1.3/ru/System.IO.Compression.ZipFile.xml", "ref/netstandard1.3/zh-hans/System.IO.Compression.ZipFile.xml", "ref/netstandard1.3/zh-hant/System.IO.Compression.ZipFile.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.IO.FileSystem/4.0.1": { "sha512": "6RxK3OUic/6+xk0IiWjEPszbRG9gzXaYisLbbChS2Im+a3Oqb3PayrR/Z6BKEh/JsEk4gOOKpTzDDBS4gq6krw==", "type": "package", "path": "System.IO.FileSystem/4.0.1", "files": [ "System.IO.FileSystem.4.0.1.nupkg.sha512", "System.IO.FileSystem.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.dll", "ref/netstandard1.3/System.IO.FileSystem.xml", "ref/netstandard1.3/de/System.IO.FileSystem.xml", "ref/netstandard1.3/es/System.IO.FileSystem.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.xml", "ref/netstandard1.3/it/System.IO.FileSystem.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.IO.FileSystem.Primitives/4.0.1": { "sha512": "58wQfv50QgewCs2owRm5kEMWDeFmlaf2ICMq5ZfLLN+dVXi0MEf8TVe9QKCOWUpdOkZL+egiOP1I67Lj5mdtfw==", "type": "package", "path": "System.IO.FileSystem.Primitives/4.0.1", "files": [ "System.IO.FileSystem.Primitives.4.0.1.nupkg.sha512", "System.IO.FileSystem.Primitives.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.IO.FileSystem.Primitives.dll", "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll", "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml", "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Linq/4.1.0": { "sha512": "1tUq0uRHAc9xvZrB3vEte0emh86Lzx5UracoyKFhKW+PZiWmIgX6SQJ1hZwnK76Qz/FiMp3S9ZxCeaTab7wk0Q==", "type": "package", "path": "System.Linq/4.1.0", "files": [ "System.Linq.4.1.0.nupkg.sha512", "System.Linq.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net463/System.Linq.dll", "lib/netcore50/System.Linq.dll", "lib/netstandard1.6/System.Linq.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net463/System.Linq.dll", "ref/netcore50/System.Linq.dll", "ref/netcore50/System.Linq.xml", "ref/netcore50/de/System.Linq.xml", "ref/netcore50/es/System.Linq.xml", "ref/netcore50/fr/System.Linq.xml", "ref/netcore50/it/System.Linq.xml", "ref/netcore50/ja/System.Linq.xml", "ref/netcore50/ko/System.Linq.xml", "ref/netcore50/ru/System.Linq.xml", "ref/netcore50/zh-hans/System.Linq.xml", "ref/netcore50/zh-hant/System.Linq.xml", "ref/netstandard1.0/System.Linq.dll", "ref/netstandard1.0/System.Linq.xml", "ref/netstandard1.0/de/System.Linq.xml", "ref/netstandard1.0/es/System.Linq.xml", "ref/netstandard1.0/fr/System.Linq.xml", "ref/netstandard1.0/it/System.Linq.xml", "ref/netstandard1.0/ja/System.Linq.xml", "ref/netstandard1.0/ko/System.Linq.xml", "ref/netstandard1.0/ru/System.Linq.xml", "ref/netstandard1.0/zh-hans/System.Linq.xml", "ref/netstandard1.0/zh-hant/System.Linq.xml", "ref/netstandard1.6/System.Linq.dll", "ref/netstandard1.6/System.Linq.xml", "ref/netstandard1.6/de/System.Linq.xml", "ref/netstandard1.6/es/System.Linq.xml", "ref/netstandard1.6/fr/System.Linq.xml", "ref/netstandard1.6/it/System.Linq.xml", "ref/netstandard1.6/ja/System.Linq.xml", "ref/netstandard1.6/ko/System.Linq.xml", "ref/netstandard1.6/ru/System.Linq.xml", "ref/netstandard1.6/zh-hans/System.Linq.xml", "ref/netstandard1.6/zh-hant/System.Linq.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Linq.Expressions/4.1.0": { "sha512": "jy/SFGKT+UYZdT91L3LNoJyaNpHoTANT7iindYuW3edsaaiVhRs+d7ZCGeIAErp16YW31xuSe2tOS3G2BtWOww==", "type": "package", "path": "System.Linq.Expressions/4.1.0", "files": [ "System.Linq.Expressions.4.1.0.nupkg.sha512", "System.Linq.Expressions.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net463/System.Linq.Expressions.dll", "lib/netcore50/System.Linq.Expressions.dll", "lib/netstandard1.6/System.Linq.Expressions.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net463/System.Linq.Expressions.dll", "ref/netcore50/System.Linq.Expressions.dll", "ref/netcore50/System.Linq.Expressions.xml", "ref/netcore50/de/System.Linq.Expressions.xml", "ref/netcore50/es/System.Linq.Expressions.xml", "ref/netcore50/fr/System.Linq.Expressions.xml", "ref/netcore50/it/System.Linq.Expressions.xml", "ref/netcore50/ja/System.Linq.Expressions.xml", "ref/netcore50/ko/System.Linq.Expressions.xml", "ref/netcore50/ru/System.Linq.Expressions.xml", "ref/netcore50/zh-hans/System.Linq.Expressions.xml", "ref/netcore50/zh-hant/System.Linq.Expressions.xml", "ref/netstandard1.0/System.Linq.Expressions.dll", "ref/netstandard1.0/System.Linq.Expressions.xml", "ref/netstandard1.0/de/System.Linq.Expressions.xml", "ref/netstandard1.0/es/System.Linq.Expressions.xml", "ref/netstandard1.0/fr/System.Linq.Expressions.xml", "ref/netstandard1.0/it/System.Linq.Expressions.xml", "ref/netstandard1.0/ja/System.Linq.Expressions.xml", "ref/netstandard1.0/ko/System.Linq.Expressions.xml", "ref/netstandard1.0/ru/System.Linq.Expressions.xml", "ref/netstandard1.0/zh-hans/System.Linq.Expressions.xml", "ref/netstandard1.0/zh-hant/System.Linq.Expressions.xml", "ref/netstandard1.3/System.Linq.Expressions.dll", "ref/netstandard1.3/System.Linq.Expressions.xml", "ref/netstandard1.3/de/System.Linq.Expressions.xml", "ref/netstandard1.3/es/System.Linq.Expressions.xml", "ref/netstandard1.3/fr/System.Linq.Expressions.xml", "ref/netstandard1.3/it/System.Linq.Expressions.xml", "ref/netstandard1.3/ja/System.Linq.Expressions.xml", "ref/netstandard1.3/ko/System.Linq.Expressions.xml", "ref/netstandard1.3/ru/System.Linq.Expressions.xml", "ref/netstandard1.3/zh-hans/System.Linq.Expressions.xml", "ref/netstandard1.3/zh-hant/System.Linq.Expressions.xml", "ref/netstandard1.6/System.Linq.Expressions.dll", "ref/netstandard1.6/System.Linq.Expressions.xml", "ref/netstandard1.6/de/System.Linq.Expressions.xml", "ref/netstandard1.6/es/System.Linq.Expressions.xml", "ref/netstandard1.6/fr/System.Linq.Expressions.xml", "ref/netstandard1.6/it/System.Linq.Expressions.xml", "ref/netstandard1.6/ja/System.Linq.Expressions.xml", "ref/netstandard1.6/ko/System.Linq.Expressions.xml", "ref/netstandard1.6/ru/System.Linq.Expressions.xml", "ref/netstandard1.6/zh-hans/System.Linq.Expressions.xml", "ref/netstandard1.6/zh-hant/System.Linq.Expressions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Linq.Expressions.dll" ] }, "System.Net.Http/4.1.0": { "sha512": "Exg1Wp7Kqmktqh/rbNIYqk1EXrf2xvOyUt3IA/P0ZpeuI8EiNioV2vHuKP9pzIWtbrRuX5sa+D5GZUSCcNARXw==", "type": "package", "path": "System.Net.Http/4.1.0", "files": [ "System.Net.Http.4.1.0.nupkg.sha512", "System.Net.Http.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/Xamarinmac20/_._", "lib/monoandroid10/_._", "lib/monotouch10/_._", "lib/net45/_._", "lib/net46/System.Net.Http.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/Xamarinmac20/_._", "ref/monoandroid10/_._", "ref/monotouch10/_._", "ref/net45/_._", "ref/net46/System.Net.Http.dll", "ref/net46/System.Net.Http.xml", "ref/net46/de/System.Net.Http.xml", "ref/net46/es/System.Net.Http.xml", "ref/net46/fr/System.Net.Http.xml", "ref/net46/it/System.Net.Http.xml", "ref/net46/ja/System.Net.Http.xml", "ref/net46/ko/System.Net.Http.xml", "ref/net46/ru/System.Net.Http.xml", "ref/net46/zh-hans/System.Net.Http.xml", "ref/net46/zh-hant/System.Net.Http.xml", "ref/netcore50/System.Net.Http.dll", "ref/netcore50/System.Net.Http.xml", "ref/netcore50/de/System.Net.Http.xml", "ref/netcore50/es/System.Net.Http.xml", "ref/netcore50/fr/System.Net.Http.xml", "ref/netcore50/it/System.Net.Http.xml", "ref/netcore50/ja/System.Net.Http.xml", "ref/netcore50/ko/System.Net.Http.xml", "ref/netcore50/ru/System.Net.Http.xml", "ref/netcore50/zh-hans/System.Net.Http.xml", "ref/netcore50/zh-hant/System.Net.Http.xml", "ref/netstandard1.1/System.Net.Http.dll", "ref/netstandard1.1/System.Net.Http.xml", "ref/netstandard1.1/de/System.Net.Http.xml", "ref/netstandard1.1/es/System.Net.Http.xml", "ref/netstandard1.1/fr/System.Net.Http.xml", "ref/netstandard1.1/it/System.Net.Http.xml", "ref/netstandard1.1/ja/System.Net.Http.xml", "ref/netstandard1.1/ko/System.Net.Http.xml", "ref/netstandard1.1/ru/System.Net.Http.xml", "ref/netstandard1.1/zh-hans/System.Net.Http.xml", "ref/netstandard1.1/zh-hant/System.Net.Http.xml", "ref/netstandard1.3/System.Net.Http.dll", "ref/netstandard1.3/System.Net.Http.xml", "ref/netstandard1.3/de/System.Net.Http.xml", "ref/netstandard1.3/es/System.Net.Http.xml", "ref/netstandard1.3/fr/System.Net.Http.xml", "ref/netstandard1.3/it/System.Net.Http.xml", "ref/netstandard1.3/ja/System.Net.Http.xml", "ref/netstandard1.3/ko/System.Net.Http.xml", "ref/netstandard1.3/ru/System.Net.Http.xml", "ref/netstandard1.3/zh-hans/System.Net.Http.xml", "ref/netstandard1.3/zh-hant/System.Net.Http.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.6/System.Net.Http.dll", "runtimes/win/lib/net46/System.Net.Http.dll", "runtimes/win/lib/netcore50/System.Net.Http.dll", "runtimes/win/lib/netstandard1.3/System.Net.Http.dll" ] }, "System.Net.Primitives/4.0.11": { "sha512": "svRy7nZOUptRg622rMcirJBuCSOOt2A94f8+afmt7HszaBVaqu3v6rrem4u2ZHdW0Rvk25cj+Jb8fDPMQngK3w==", "type": "package", "path": "System.Net.Primitives/4.0.11", "files": [ "System.Net.Primitives.4.0.11.nupkg.sha512", "System.Net.Primitives.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Net.Primitives.dll", "ref/netcore50/System.Net.Primitives.xml", "ref/netcore50/de/System.Net.Primitives.xml", "ref/netcore50/es/System.Net.Primitives.xml", "ref/netcore50/fr/System.Net.Primitives.xml", "ref/netcore50/it/System.Net.Primitives.xml", "ref/netcore50/ja/System.Net.Primitives.xml", "ref/netcore50/ko/System.Net.Primitives.xml", "ref/netcore50/ru/System.Net.Primitives.xml", "ref/netcore50/zh-hans/System.Net.Primitives.xml", "ref/netcore50/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.0/System.Net.Primitives.dll", "ref/netstandard1.0/System.Net.Primitives.xml", "ref/netstandard1.0/de/System.Net.Primitives.xml", "ref/netstandard1.0/es/System.Net.Primitives.xml", "ref/netstandard1.0/fr/System.Net.Primitives.xml", "ref/netstandard1.0/it/System.Net.Primitives.xml", "ref/netstandard1.0/ja/System.Net.Primitives.xml", "ref/netstandard1.0/ko/System.Net.Primitives.xml", "ref/netstandard1.0/ru/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.1/System.Net.Primitives.dll", "ref/netstandard1.1/System.Net.Primitives.xml", "ref/netstandard1.1/de/System.Net.Primitives.xml", "ref/netstandard1.1/es/System.Net.Primitives.xml", "ref/netstandard1.1/fr/System.Net.Primitives.xml", "ref/netstandard1.1/it/System.Net.Primitives.xml", "ref/netstandard1.1/ja/System.Net.Primitives.xml", "ref/netstandard1.1/ko/System.Net.Primitives.xml", "ref/netstandard1.1/ru/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.1/zh-hant/System.Net.Primitives.xml", "ref/netstandard1.3/System.Net.Primitives.dll", "ref/netstandard1.3/System.Net.Primitives.xml", "ref/netstandard1.3/de/System.Net.Primitives.xml", "ref/netstandard1.3/es/System.Net.Primitives.xml", "ref/netstandard1.3/fr/System.Net.Primitives.xml", "ref/netstandard1.3/it/System.Net.Primitives.xml", "ref/netstandard1.3/ja/System.Net.Primitives.xml", "ref/netstandard1.3/ko/System.Net.Primitives.xml", "ref/netstandard1.3/ru/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hans/System.Net.Primitives.xml", "ref/netstandard1.3/zh-hant/System.Net.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Net.Sockets/4.1.0": { "sha512": "4yYs0WPAv7OdYGXZpmJ19USjiV9QX9r4pTNrHUgdsjjMxrLtXO2hGplU+v0TrD6TU2ygdEjSYCi3zgJhYqY4bw==", "type": "package", "path": "System.Net.Sockets/4.1.0", "files": [ "System.Net.Sockets.4.1.0.nupkg.sha512", "System.Net.Sockets.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Net.Sockets.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.dll", "ref/netstandard1.3/System.Net.Sockets.xml", "ref/netstandard1.3/de/System.Net.Sockets.xml", "ref/netstandard1.3/es/System.Net.Sockets.xml", "ref/netstandard1.3/fr/System.Net.Sockets.xml", "ref/netstandard1.3/it/System.Net.Sockets.xml", "ref/netstandard1.3/ja/System.Net.Sockets.xml", "ref/netstandard1.3/ko/System.Net.Sockets.xml", "ref/netstandard1.3/ru/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hans/System.Net.Sockets.xml", "ref/netstandard1.3/zh-hant/System.Net.Sockets.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.ObjectModel/4.0.12": { "sha512": "sbJ21bsz5F0aJuRRlodMF8glEFfy++HwudqyvDyQLiJqEtJ+J6c7z1JuB9YmIDnPbpQwAaychjc1+/LeFp/KcA==", "type": "package", "path": "System.ObjectModel/4.0.12", "files": [ "System.ObjectModel.4.0.12.nupkg.sha512", "System.ObjectModel.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.ObjectModel.dll", "lib/netstandard1.3/System.ObjectModel.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.ObjectModel.dll", "ref/netcore50/System.ObjectModel.xml", "ref/netcore50/de/System.ObjectModel.xml", "ref/netcore50/es/System.ObjectModel.xml", "ref/netcore50/fr/System.ObjectModel.xml", "ref/netcore50/it/System.ObjectModel.xml", "ref/netcore50/ja/System.ObjectModel.xml", "ref/netcore50/ko/System.ObjectModel.xml", "ref/netcore50/ru/System.ObjectModel.xml", "ref/netcore50/zh-hans/System.ObjectModel.xml", "ref/netcore50/zh-hant/System.ObjectModel.xml", "ref/netstandard1.0/System.ObjectModel.dll", "ref/netstandard1.0/System.ObjectModel.xml", "ref/netstandard1.0/de/System.ObjectModel.xml", "ref/netstandard1.0/es/System.ObjectModel.xml", "ref/netstandard1.0/fr/System.ObjectModel.xml", "ref/netstandard1.0/it/System.ObjectModel.xml", "ref/netstandard1.0/ja/System.ObjectModel.xml", "ref/netstandard1.0/ko/System.ObjectModel.xml", "ref/netstandard1.0/ru/System.ObjectModel.xml", "ref/netstandard1.0/zh-hans/System.ObjectModel.xml", "ref/netstandard1.0/zh-hant/System.ObjectModel.xml", "ref/netstandard1.3/System.ObjectModel.dll", "ref/netstandard1.3/System.ObjectModel.xml", "ref/netstandard1.3/de/System.ObjectModel.xml", "ref/netstandard1.3/es/System.ObjectModel.xml", "ref/netstandard1.3/fr/System.ObjectModel.xml", "ref/netstandard1.3/it/System.ObjectModel.xml", "ref/netstandard1.3/ja/System.ObjectModel.xml", "ref/netstandard1.3/ko/System.ObjectModel.xml", "ref/netstandard1.3/ru/System.ObjectModel.xml", "ref/netstandard1.3/zh-hans/System.ObjectModel.xml", "ref/netstandard1.3/zh-hant/System.ObjectModel.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Reflection/4.1.0": { "sha512": "AkVQr5VlJCdzfk+UHgquE6DJJ3HYsJrVwb8s7+mxJxzsFjyRJl7wYyZvXMrfBqJmRpzgPofgVBJJt4lvBOTupA==", "type": "package", "path": "System.Reflection/4.1.0", "files": [ "System.Reflection.4.1.0.nupkg.sha512", "System.Reflection.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Reflection.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Reflection.dll", "ref/netcore50/System.Reflection.dll", "ref/netcore50/System.Reflection.xml", "ref/netcore50/de/System.Reflection.xml", "ref/netcore50/es/System.Reflection.xml", "ref/netcore50/fr/System.Reflection.xml", "ref/netcore50/it/System.Reflection.xml", "ref/netcore50/ja/System.Reflection.xml", "ref/netcore50/ko/System.Reflection.xml", "ref/netcore50/ru/System.Reflection.xml", "ref/netcore50/zh-hans/System.Reflection.xml", "ref/netcore50/zh-hant/System.Reflection.xml", "ref/netstandard1.0/System.Reflection.dll", "ref/netstandard1.0/System.Reflection.xml", "ref/netstandard1.0/de/System.Reflection.xml", "ref/netstandard1.0/es/System.Reflection.xml", "ref/netstandard1.0/fr/System.Reflection.xml", "ref/netstandard1.0/it/System.Reflection.xml", "ref/netstandard1.0/ja/System.Reflection.xml", "ref/netstandard1.0/ko/System.Reflection.xml", "ref/netstandard1.0/ru/System.Reflection.xml", "ref/netstandard1.0/zh-hans/System.Reflection.xml", "ref/netstandard1.0/zh-hant/System.Reflection.xml", "ref/netstandard1.3/System.Reflection.dll", "ref/netstandard1.3/System.Reflection.xml", "ref/netstandard1.3/de/System.Reflection.xml", "ref/netstandard1.3/es/System.Reflection.xml", "ref/netstandard1.3/fr/System.Reflection.xml", "ref/netstandard1.3/it/System.Reflection.xml", "ref/netstandard1.3/ja/System.Reflection.xml", "ref/netstandard1.3/ko/System.Reflection.xml", "ref/netstandard1.3/ru/System.Reflection.xml", "ref/netstandard1.3/zh-hans/System.Reflection.xml", "ref/netstandard1.3/zh-hant/System.Reflection.xml", "ref/netstandard1.5/System.Reflection.dll", "ref/netstandard1.5/System.Reflection.xml", "ref/netstandard1.5/de/System.Reflection.xml", "ref/netstandard1.5/es/System.Reflection.xml", "ref/netstandard1.5/fr/System.Reflection.xml", "ref/netstandard1.5/it/System.Reflection.xml", "ref/netstandard1.5/ja/System.Reflection.xml", "ref/netstandard1.5/ko/System.Reflection.xml", "ref/netstandard1.5/ru/System.Reflection.xml", "ref/netstandard1.5/zh-hans/System.Reflection.xml", "ref/netstandard1.5/zh-hant/System.Reflection.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Reflection.Emit/4.0.1": { "sha512": "78w2PN55KRTD3GOn5c8LGkOLqeL/mHuM4ewlV2TbI3Itu97ziZ7WvtcsyVDuB9vPJTJeOc+RythqIoWhf1dKNQ==", "type": "package", "path": "System.Reflection.Emit/4.0.1", "files": [ "System.Reflection.Emit.4.0.1.nupkg.sha512", "System.Reflection.Emit.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/net45/_._", "lib/netcore50/System.Reflection.Emit.dll", "lib/netstandard1.3/System.Reflection.Emit.dll", "lib/xamarinmac20/_._", "ref/MonoAndroid10/_._", "ref/net45/_._", "ref/netstandard1.1/System.Reflection.Emit.dll", "ref/netstandard1.1/System.Reflection.Emit.xml", "ref/netstandard1.1/de/System.Reflection.Emit.xml", "ref/netstandard1.1/es/System.Reflection.Emit.xml", "ref/netstandard1.1/fr/System.Reflection.Emit.xml", "ref/netstandard1.1/it/System.Reflection.Emit.xml", "ref/netstandard1.1/ja/System.Reflection.Emit.xml", "ref/netstandard1.1/ko/System.Reflection.Emit.xml", "ref/netstandard1.1/ru/System.Reflection.Emit.xml", "ref/netstandard1.1/zh-hans/System.Reflection.Emit.xml", "ref/netstandard1.1/zh-hant/System.Reflection.Emit.xml", "ref/xamarinmac20/_._" ] }, "System.Reflection.Emit.ILGeneration/4.0.1": { "sha512": "6CZgDCpbJNKxzxHNO6Vd+FX4lXduWfNjGI6FJBt7Y0n5e4cN5H6tzD+DDm0GDY3jj+zUtem5WzOXHJE6Tn6a/Q==", "type": "package", "path": "System.Reflection.Emit.ILGeneration/4.0.1", "files": [ "System.Reflection.Emit.ILGeneration.4.0.1.nupkg.sha512", "System.Reflection.Emit.ILGeneration.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net45/_._", "lib/netcore50/System.Reflection.Emit.ILGeneration.dll", "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll", "lib/portable-net45+wp8/_._", "lib/wp80/_._", "ref/net45/_._", "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.dll", "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.xml", "ref/netstandard1.0/de/System.Reflection.Emit.ILGeneration.xml", "ref/netstandard1.0/es/System.Reflection.Emit.ILGeneration.xml", "ref/netstandard1.0/fr/System.Reflection.Emit.ILGeneration.xml", "ref/netstandard1.0/it/System.Reflection.Emit.ILGeneration.xml", "ref/netstandard1.0/ja/System.Reflection.Emit.ILGeneration.xml", "ref/netstandard1.0/ko/System.Reflection.Emit.ILGeneration.xml", "ref/netstandard1.0/ru/System.Reflection.Emit.ILGeneration.xml", "ref/netstandard1.0/zh-hans/System.Reflection.Emit.ILGeneration.xml", "ref/netstandard1.0/zh-hant/System.Reflection.Emit.ILGeneration.xml", "ref/portable-net45+wp8/_._", "ref/wp80/_._", "runtimes/aot/lib/netcore50/_._" ] }, "System.Reflection.Emit.Lightweight/4.0.1": { "sha512": "KJzuAxjyGuNI1ae7ueQnktw7/PZEZ6Jew64ZJHF+9hpftcDS7TD0tISYc2xE5G5OM870JD+fTxPI1z28cN75xQ==", "type": "package", "path": "System.Reflection.Emit.Lightweight/4.0.1", "files": [ "System.Reflection.Emit.Lightweight.4.0.1.nupkg.sha512", "System.Reflection.Emit.Lightweight.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net45/_._", "lib/netcore50/System.Reflection.Emit.Lightweight.dll", "lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll", "lib/portable-net45+wp8/_._", "lib/wp80/_._", "ref/net45/_._", "ref/netstandard1.0/System.Reflection.Emit.Lightweight.dll", "ref/netstandard1.0/System.Reflection.Emit.Lightweight.xml", "ref/netstandard1.0/de/System.Reflection.Emit.Lightweight.xml", "ref/netstandard1.0/es/System.Reflection.Emit.Lightweight.xml", "ref/netstandard1.0/fr/System.Reflection.Emit.Lightweight.xml", "ref/netstandard1.0/it/System.Reflection.Emit.Lightweight.xml", "ref/netstandard1.0/ja/System.Reflection.Emit.Lightweight.xml", "ref/netstandard1.0/ko/System.Reflection.Emit.Lightweight.xml", "ref/netstandard1.0/ru/System.Reflection.Emit.Lightweight.xml", "ref/netstandard1.0/zh-hans/System.Reflection.Emit.Lightweight.xml", "ref/netstandard1.0/zh-hant/System.Reflection.Emit.Lightweight.xml", "ref/portable-net45+wp8/_._", "ref/wp80/_._", "runtimes/aot/lib/netcore50/_._" ] }, "System.Reflection.Extensions/4.0.1": { "sha512": "xbALJfzxgs1/jtfltoS8+tJF57THuXN2+iOv9HWPE/Ol7cBIIEglUCY7llDkKBlyXzzV9v+BpQOYK1ps6lWsMQ==", "type": "package", "path": "System.Reflection.Extensions/4.0.1", "files": [ "System.Reflection.Extensions.4.0.1.nupkg.sha512", "System.Reflection.Extensions.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Reflection.Extensions.dll", "ref/netcore50/System.Reflection.Extensions.xml", "ref/netcore50/de/System.Reflection.Extensions.xml", "ref/netcore50/es/System.Reflection.Extensions.xml", "ref/netcore50/fr/System.Reflection.Extensions.xml", "ref/netcore50/it/System.Reflection.Extensions.xml", "ref/netcore50/ja/System.Reflection.Extensions.xml", "ref/netcore50/ko/System.Reflection.Extensions.xml", "ref/netcore50/ru/System.Reflection.Extensions.xml", "ref/netcore50/zh-hans/System.Reflection.Extensions.xml", "ref/netcore50/zh-hant/System.Reflection.Extensions.xml", "ref/netstandard1.0/System.Reflection.Extensions.dll", "ref/netstandard1.0/System.Reflection.Extensions.xml", "ref/netstandard1.0/de/System.Reflection.Extensions.xml", "ref/netstandard1.0/es/System.Reflection.Extensions.xml", "ref/netstandard1.0/fr/System.Reflection.Extensions.xml", "ref/netstandard1.0/it/System.Reflection.Extensions.xml", "ref/netstandard1.0/ja/System.Reflection.Extensions.xml", "ref/netstandard1.0/ko/System.Reflection.Extensions.xml", "ref/netstandard1.0/ru/System.Reflection.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Reflection.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Reflection.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Reflection.Primitives/4.0.1": { "sha512": "QD0i9BS7v4eMpSjFOlkXVhEU/VOD0hkC9T57GaSdBbh3vekbnL1KsudBH16Gf4AauH6CcFRAcbjuVkj+ZV2h4g==", "type": "package", "path": "System.Reflection.Primitives/4.0.1", "files": [ "System.Reflection.Primitives.4.0.1.nupkg.sha512", "System.Reflection.Primitives.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Reflection.Primitives.dll", "ref/netcore50/System.Reflection.Primitives.xml", "ref/netcore50/de/System.Reflection.Primitives.xml", "ref/netcore50/es/System.Reflection.Primitives.xml", "ref/netcore50/fr/System.Reflection.Primitives.xml", "ref/netcore50/it/System.Reflection.Primitives.xml", "ref/netcore50/ja/System.Reflection.Primitives.xml", "ref/netcore50/ko/System.Reflection.Primitives.xml", "ref/netcore50/ru/System.Reflection.Primitives.xml", "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", "ref/netstandard1.0/System.Reflection.Primitives.dll", "ref/netstandard1.0/System.Reflection.Primitives.xml", "ref/netstandard1.0/de/System.Reflection.Primitives.xml", "ref/netstandard1.0/es/System.Reflection.Primitives.xml", "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", "ref/netstandard1.0/it/System.Reflection.Primitives.xml", "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Reflection.TypeExtensions/4.1.0": { "sha512": "+Mphr2/ChE98e7oMPFXDkFp/Gjd/Ch/UY84i1XgDgpg8NlnVK3lf4OwREwerNUhBV0ujhm9Qkh2d8YkxhlcT4g==", "type": "package", "path": "System.Reflection.TypeExtensions/4.1.0", "files": [ "System.Reflection.TypeExtensions.4.1.0.nupkg.sha512", "System.Reflection.TypeExtensions.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Reflection.TypeExtensions.dll", "lib/net462/System.Reflection.TypeExtensions.dll", "lib/netcore50/System.Reflection.TypeExtensions.dll", "lib/netstandard1.5/System.Reflection.TypeExtensions.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Reflection.TypeExtensions.dll", "ref/net462/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.dll", "ref/netstandard1.3/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/System.Reflection.TypeExtensions.dll", "ref/netstandard1.5/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml", "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll" ] }, "System.Resources.ResourceManager/4.0.1": { "sha512": "kB67pWsjh4QH9ww23uKt/zTd65XN2jMCA0ZNwr+C1TILo8692Br0KtKQblBfN3DQuFiEl+1MYv+pPpkVJlMN+A==", "type": "package", "path": "System.Resources.ResourceManager/4.0.1", "files": [ "System.Resources.ResourceManager.4.0.1.nupkg.sha512", "System.Resources.ResourceManager.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Resources.ResourceManager.dll", "ref/netcore50/System.Resources.ResourceManager.xml", "ref/netcore50/de/System.Resources.ResourceManager.xml", "ref/netcore50/es/System.Resources.ResourceManager.xml", "ref/netcore50/fr/System.Resources.ResourceManager.xml", "ref/netcore50/it/System.Resources.ResourceManager.xml", "ref/netcore50/ja/System.Resources.ResourceManager.xml", "ref/netcore50/ko/System.Resources.ResourceManager.xml", "ref/netcore50/ru/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml", "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml", "ref/netstandard1.0/System.Resources.ResourceManager.dll", "ref/netstandard1.0/System.Resources.ResourceManager.xml", "ref/netstandard1.0/de/System.Resources.ResourceManager.xml", "ref/netstandard1.0/es/System.Resources.ResourceManager.xml", "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml", "ref/netstandard1.0/it/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml", "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml", "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Runtime/4.1.0": { "sha512": "/k532PHTaDa7fouSoVKiooY7h+npY1ySLUV5Ohd7mfQYQMU+ruUrxZOFdTbVvRLbHb+IuY5xBaelYtIoZ/iOAQ==", "type": "package", "path": "System.Runtime/4.1.0", "files": [ "System.Runtime.4.1.0.nupkg.sha512", "System.Runtime.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.dll", "lib/portable-net45+win8+wp80+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.dll", "ref/netcore50/System.Runtime.dll", "ref/netcore50/System.Runtime.xml", "ref/netcore50/de/System.Runtime.xml", "ref/netcore50/es/System.Runtime.xml", "ref/netcore50/fr/System.Runtime.xml", "ref/netcore50/it/System.Runtime.xml", "ref/netcore50/ja/System.Runtime.xml", "ref/netcore50/ko/System.Runtime.xml", "ref/netcore50/ru/System.Runtime.xml", "ref/netcore50/zh-hans/System.Runtime.xml", "ref/netcore50/zh-hant/System.Runtime.xml", "ref/netstandard1.0/System.Runtime.dll", "ref/netstandard1.0/System.Runtime.xml", "ref/netstandard1.0/de/System.Runtime.xml", "ref/netstandard1.0/es/System.Runtime.xml", "ref/netstandard1.0/fr/System.Runtime.xml", "ref/netstandard1.0/it/System.Runtime.xml", "ref/netstandard1.0/ja/System.Runtime.xml", "ref/netstandard1.0/ko/System.Runtime.xml", "ref/netstandard1.0/ru/System.Runtime.xml", "ref/netstandard1.0/zh-hans/System.Runtime.xml", "ref/netstandard1.0/zh-hant/System.Runtime.xml", "ref/netstandard1.2/System.Runtime.dll", "ref/netstandard1.2/System.Runtime.xml", "ref/netstandard1.2/de/System.Runtime.xml", "ref/netstandard1.2/es/System.Runtime.xml", "ref/netstandard1.2/fr/System.Runtime.xml", "ref/netstandard1.2/it/System.Runtime.xml", "ref/netstandard1.2/ja/System.Runtime.xml", "ref/netstandard1.2/ko/System.Runtime.xml", "ref/netstandard1.2/ru/System.Runtime.xml", "ref/netstandard1.2/zh-hans/System.Runtime.xml", "ref/netstandard1.2/zh-hant/System.Runtime.xml", "ref/netstandard1.3/System.Runtime.dll", "ref/netstandard1.3/System.Runtime.xml", "ref/netstandard1.3/de/System.Runtime.xml", "ref/netstandard1.3/es/System.Runtime.xml", "ref/netstandard1.3/fr/System.Runtime.xml", "ref/netstandard1.3/it/System.Runtime.xml", "ref/netstandard1.3/ja/System.Runtime.xml", "ref/netstandard1.3/ko/System.Runtime.xml", "ref/netstandard1.3/ru/System.Runtime.xml", "ref/netstandard1.3/zh-hans/System.Runtime.xml", "ref/netstandard1.3/zh-hant/System.Runtime.xml", "ref/netstandard1.5/System.Runtime.dll", "ref/netstandard1.5/System.Runtime.xml", "ref/netstandard1.5/de/System.Runtime.xml", "ref/netstandard1.5/es/System.Runtime.xml", "ref/netstandard1.5/fr/System.Runtime.xml", "ref/netstandard1.5/it/System.Runtime.xml", "ref/netstandard1.5/ja/System.Runtime.xml", "ref/netstandard1.5/ko/System.Runtime.xml", "ref/netstandard1.5/ru/System.Runtime.xml", "ref/netstandard1.5/zh-hans/System.Runtime.xml", "ref/netstandard1.5/zh-hant/System.Runtime.xml", "ref/portable-net45+win8+wp80+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Runtime.Extensions/4.1.0": { "sha512": "QKBt96oHHyyJv8bnAcSHqjLkSSW/t/7nboGi489j6OYGkQpaM9ghwhoeYR+z4qQ9gS7d2MvTR0VIh2DyEzSasA==", "type": "package", "path": "System.Runtime.Extensions/4.1.0", "files": [ "System.Runtime.Extensions.4.1.0.nupkg.sha512", "System.Runtime.Extensions.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.dll", "ref/netcore50/System.Runtime.Extensions.xml", "ref/netcore50/de/System.Runtime.Extensions.xml", "ref/netcore50/es/System.Runtime.Extensions.xml", "ref/netcore50/fr/System.Runtime.Extensions.xml", "ref/netcore50/it/System.Runtime.Extensions.xml", "ref/netcore50/ja/System.Runtime.Extensions.xml", "ref/netcore50/ko/System.Runtime.Extensions.xml", "ref/netcore50/ru/System.Runtime.Extensions.xml", "ref/netcore50/zh-hans/System.Runtime.Extensions.xml", "ref/netcore50/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.0/System.Runtime.Extensions.dll", "ref/netstandard1.0/System.Runtime.Extensions.xml", "ref/netstandard1.0/de/System.Runtime.Extensions.xml", "ref/netstandard1.0/es/System.Runtime.Extensions.xml", "ref/netstandard1.0/fr/System.Runtime.Extensions.xml", "ref/netstandard1.0/it/System.Runtime.Extensions.xml", "ref/netstandard1.0/ja/System.Runtime.Extensions.xml", "ref/netstandard1.0/ko/System.Runtime.Extensions.xml", "ref/netstandard1.0/ru/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.3/System.Runtime.Extensions.dll", "ref/netstandard1.3/System.Runtime.Extensions.xml", "ref/netstandard1.3/de/System.Runtime.Extensions.xml", "ref/netstandard1.3/es/System.Runtime.Extensions.xml", "ref/netstandard1.3/fr/System.Runtime.Extensions.xml", "ref/netstandard1.3/it/System.Runtime.Extensions.xml", "ref/netstandard1.3/ja/System.Runtime.Extensions.xml", "ref/netstandard1.3/ko/System.Runtime.Extensions.xml", "ref/netstandard1.3/ru/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml", "ref/netstandard1.5/System.Runtime.Extensions.dll", "ref/netstandard1.5/System.Runtime.Extensions.xml", "ref/netstandard1.5/de/System.Runtime.Extensions.xml", "ref/netstandard1.5/es/System.Runtime.Extensions.xml", "ref/netstandard1.5/fr/System.Runtime.Extensions.xml", "ref/netstandard1.5/it/System.Runtime.Extensions.xml", "ref/netstandard1.5/ja/System.Runtime.Extensions.xml", "ref/netstandard1.5/ko/System.Runtime.Extensions.xml", "ref/netstandard1.5/ru/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml", "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Runtime.Handles/4.0.1": { "sha512": "WDqxX+UVhSQ5VqEE3PKN5Kbmz58I+PMpCSm95vI72lp6ewChuTllDoOdfOl3gw0k30FWMz2uNXgPy9EgL8BaPg==", "type": "package", "path": "System.Runtime.Handles/4.0.1", "files": [ "System.Runtime.Handles.4.0.1.nupkg.sha512", "System.Runtime.Handles.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/_._", "ref/netstandard1.3/System.Runtime.Handles.dll", "ref/netstandard1.3/System.Runtime.Handles.xml", "ref/netstandard1.3/de/System.Runtime.Handles.xml", "ref/netstandard1.3/es/System.Runtime.Handles.xml", "ref/netstandard1.3/fr/System.Runtime.Handles.xml", "ref/netstandard1.3/it/System.Runtime.Handles.xml", "ref/netstandard1.3/ja/System.Runtime.Handles.xml", "ref/netstandard1.3/ko/System.Runtime.Handles.xml", "ref/netstandard1.3/ru/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Runtime.InteropServices/4.1.0": { "sha512": "p9pBuqAGCYjyNrDiA5J55n2Ys3Tjy61fH6R2jGBJr1Ymz1V0fIlv9gLBdx/G9KmRHYFM9KFM4Jxpa0YVpfG8AA==", "type": "package", "path": "System.Runtime.InteropServices/4.1.0", "files": [ "System.Runtime.InteropServices.4.1.0.nupkg.sha512", "System.Runtime.InteropServices.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net462/System.Runtime.InteropServices.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net462/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.dll", "ref/netcore50/System.Runtime.InteropServices.xml", "ref/netcore50/de/System.Runtime.InteropServices.xml", "ref/netcore50/es/System.Runtime.InteropServices.xml", "ref/netcore50/fr/System.Runtime.InteropServices.xml", "ref/netcore50/it/System.Runtime.InteropServices.xml", "ref/netcore50/ja/System.Runtime.InteropServices.xml", "ref/netcore50/ko/System.Runtime.InteropServices.xml", "ref/netcore50/ru/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml", "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.1/System.Runtime.InteropServices.dll", "ref/netstandard1.1/System.Runtime.InteropServices.xml", "ref/netstandard1.1/de/System.Runtime.InteropServices.xml", "ref/netstandard1.1/es/System.Runtime.InteropServices.xml", "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.1/it/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.2/System.Runtime.InteropServices.dll", "ref/netstandard1.2/System.Runtime.InteropServices.xml", "ref/netstandard1.2/de/System.Runtime.InteropServices.xml", "ref/netstandard1.2/es/System.Runtime.InteropServices.xml", "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.2/it/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.3/System.Runtime.InteropServices.dll", "ref/netstandard1.3/System.Runtime.InteropServices.xml", "ref/netstandard1.3/de/System.Runtime.InteropServices.xml", "ref/netstandard1.3/es/System.Runtime.InteropServices.xml", "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.3/it/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml", "ref/netstandard1.5/System.Runtime.InteropServices.dll", "ref/netstandard1.5/System.Runtime.InteropServices.xml", "ref/netstandard1.5/de/System.Runtime.InteropServices.xml", "ref/netstandard1.5/es/System.Runtime.InteropServices.xml", "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml", "ref/netstandard1.5/it/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml", "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml", "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Runtime.InteropServices.RuntimeInformation/4.0.0": { "sha512": "YlG4l3iUdzN+edwvbYKMtIq32R/gJtSzYBhsfcOMh5sUuynkoteYDN7N2/2l7lfTlPD0D9hV2uLeZy0AbHVh1A==", "type": "package", "path": "System.Runtime.InteropServices.RuntimeInformation/4.0.0", "files": [ "System.Runtime.InteropServices.RuntimeInformation.4.0.0.nupkg.sha512", "System.Runtime.InteropServices.RuntimeInformation.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/System.Runtime.InteropServices.RuntimeInformation.dll", "lib/win8/System.Runtime.InteropServices.RuntimeInformation.dll", "lib/wpa81/System.Runtime.InteropServices.RuntimeInformation.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Runtime.InteropServices.RuntimeInformation.dll", "runtimes/unix/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll", "runtimes/win/lib/net45/System.Runtime.InteropServices.RuntimeInformation.dll", "runtimes/win/lib/netcore50/System.Runtime.InteropServices.RuntimeInformation.dll", "runtimes/win/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll" ] }, "System.Runtime.Numerics/4.0.1": { "sha512": "FtLv8UyQEc1FDaAjRtXBSYqsHBZYXeI8ygfFmJXYbIfb4kSHJ3+hURaeDkpLVMG40ykVorVdH8J0KYzNr9yNOw==", "type": "package", "path": "System.Runtime.Numerics/4.0.1", "files": [ "System.Runtime.Numerics.4.0.1.nupkg.sha512", "System.Runtime.Numerics.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Runtime.Numerics.dll", "lib/netstandard1.3/System.Runtime.Numerics.dll", "lib/portable-net45+win8+wpa81/_._", "lib/win8/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Runtime.Numerics.dll", "ref/netcore50/System.Runtime.Numerics.xml", "ref/netcore50/de/System.Runtime.Numerics.xml", "ref/netcore50/es/System.Runtime.Numerics.xml", "ref/netcore50/fr/System.Runtime.Numerics.xml", "ref/netcore50/it/System.Runtime.Numerics.xml", "ref/netcore50/ja/System.Runtime.Numerics.xml", "ref/netcore50/ko/System.Runtime.Numerics.xml", "ref/netcore50/ru/System.Runtime.Numerics.xml", "ref/netcore50/zh-hans/System.Runtime.Numerics.xml", "ref/netcore50/zh-hant/System.Runtime.Numerics.xml", "ref/netstandard1.1/System.Runtime.Numerics.dll", "ref/netstandard1.1/System.Runtime.Numerics.xml", "ref/netstandard1.1/de/System.Runtime.Numerics.xml", "ref/netstandard1.1/es/System.Runtime.Numerics.xml", "ref/netstandard1.1/fr/System.Runtime.Numerics.xml", "ref/netstandard1.1/it/System.Runtime.Numerics.xml", "ref/netstandard1.1/ja/System.Runtime.Numerics.xml", "ref/netstandard1.1/ko/System.Runtime.Numerics.xml", "ref/netstandard1.1/ru/System.Runtime.Numerics.xml", "ref/netstandard1.1/zh-hans/System.Runtime.Numerics.xml", "ref/netstandard1.1/zh-hant/System.Runtime.Numerics.xml", "ref/portable-net45+win8+wpa81/_._", "ref/win8/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Runtime.Serialization.Primitives/4.1.1": { "sha512": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", "type": "package", "path": "System.Runtime.Serialization.Primitives/4.1.1", "files": [ "System.Runtime.Serialization.Primitives.4.1.1.nupkg.sha512", "System.Runtime.Serialization.Primitives.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net46/System.Runtime.Serialization.Primitives.dll", "lib/netcore50/System.Runtime.Serialization.Primitives.dll", "lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net46/System.Runtime.Serialization.Primitives.dll", "ref/netcore50/System.Runtime.Serialization.Primitives.dll", "ref/netcore50/System.Runtime.Serialization.Primitives.xml", "ref/netcore50/de/System.Runtime.Serialization.Primitives.xml", "ref/netcore50/es/System.Runtime.Serialization.Primitives.xml", "ref/netcore50/fr/System.Runtime.Serialization.Primitives.xml", "ref/netcore50/it/System.Runtime.Serialization.Primitives.xml", "ref/netcore50/ja/System.Runtime.Serialization.Primitives.xml", "ref/netcore50/ko/System.Runtime.Serialization.Primitives.xml", "ref/netcore50/ru/System.Runtime.Serialization.Primitives.xml", "ref/netcore50/zh-hans/System.Runtime.Serialization.Primitives.xml", "ref/netcore50/zh-hant/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/System.Runtime.Serialization.Primitives.dll", "ref/netstandard1.0/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/de/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/es/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/fr/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/it/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/ja/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/ko/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/ru/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/zh-hans/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.0/zh-hant/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/System.Runtime.Serialization.Primitives.dll", "ref/netstandard1.3/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/de/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/es/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/fr/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/it/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/ja/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/ko/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/ru/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/zh-hans/System.Runtime.Serialization.Primitives.xml", "ref/netstandard1.3/zh-hant/System.Runtime.Serialization.Primitives.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Runtime.Serialization.Primitives.dll" ] }, "System.Security.Cryptography.Algorithms/4.2.0": { "sha512": "9LS5BHpndNsWPZcK1abft3cT3j0H9e1fPdUjL3oNFun6u5ZIxEd/aMMZXucLnatlKh0Fi7cTgsUkvIQsd5+XIg==", "type": "package", "path": "System.Security.Cryptography.Algorithms/4.2.0", "files": [ "System.Security.Cryptography.Algorithms.4.2.0.nupkg.sha512", "System.Security.Cryptography.Algorithms.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Algorithms.dll", "lib/net461/System.Security.Cryptography.Algorithms.dll", "lib/net463/System.Security.Cryptography.Algorithms.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Algorithms.dll", "ref/net461/System.Security.Cryptography.Algorithms.dll", "ref/net463/System.Security.Cryptography.Algorithms.dll", "ref/netstandard1.3/System.Security.Cryptography.Algorithms.dll", "ref/netstandard1.4/System.Security.Cryptography.Algorithms.dll", "ref/netstandard1.6/System.Security.Cryptography.Algorithms.dll", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/net46/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/net461/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/net463/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/netcore50/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll" ] }, "System.Security.Cryptography.Cng/4.2.0": { "sha512": "NNaCsYL+dqUQ/1oJOHCknhMHBuJaF6JRuK0eBnfxI34l5PKFaH3SvvHVAdpG3/3GXjkEEG2syBC2kx/2e0mPwg==", "type": "package", "path": "System.Security.Cryptography.Cng/4.2.0", "files": [ "System.Security.Cryptography.Cng.4.2.0.nupkg.sha512", "System.Security.Cryptography.Cng.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Security.Cryptography.Cng.dll", "lib/net461/System.Security.Cryptography.Cng.dll", "lib/net463/System.Security.Cryptography.Cng.dll", "ref/net46/System.Security.Cryptography.Cng.dll", "ref/net461/System.Security.Cryptography.Cng.dll", "ref/net463/System.Security.Cryptography.Cng.dll", "ref/netstandard1.3/System.Security.Cryptography.Cng.dll", "ref/netstandard1.4/System.Security.Cryptography.Cng.dll", "ref/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net463/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll" ] }, "System.Security.Cryptography.Csp/4.0.0": { "sha512": "zLWWrV/51uS/tBGDchSrq4vvUds8Mt9CP7WAXGgnhbhmyEPWL3Imf2fVlzVQE2qScDyH8KrSBXXbgQte/mgH9Q==", "type": "package", "path": "System.Security.Cryptography.Csp/4.0.0", "files": [ "System.Security.Cryptography.Csp.4.0.0.nupkg.sha512", "System.Security.Cryptography.Csp.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Csp.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Csp.dll", "ref/netstandard1.3/System.Security.Cryptography.Csp.dll", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Csp.dll", "runtimes/win/lib/net46/System.Security.Cryptography.Csp.dll", "runtimes/win/lib/netcore50/_._", "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Csp.dll" ] }, "System.Security.Cryptography.Encoding/4.0.0": { "sha512": "qbX8PkXQx8MUx810JLQ1UVNCAnU/zgfNcFTyYASO1vPF2xpHF64T5i/Q5AMd7Y2ag1AJixcojvY+DRCXgJl9wg==", "type": "package", "path": "System.Security.Cryptography.Encoding/4.0.0", "files": [ "System.Security.Cryptography.Encoding.4.0.0.nupkg.sha512", "System.Security.Cryptography.Encoding.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Encoding.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Encoding.dll", "ref/netstandard1.3/System.Security.Cryptography.Encoding.dll", "ref/netstandard1.3/System.Security.Cryptography.Encoding.xml", "ref/netstandard1.3/de/System.Security.Cryptography.Encoding.xml", "ref/netstandard1.3/es/System.Security.Cryptography.Encoding.xml", "ref/netstandard1.3/fr/System.Security.Cryptography.Encoding.xml", "ref/netstandard1.3/it/System.Security.Cryptography.Encoding.xml", "ref/netstandard1.3/ja/System.Security.Cryptography.Encoding.xml", "ref/netstandard1.3/ko/System.Security.Cryptography.Encoding.xml", "ref/netstandard1.3/ru/System.Security.Cryptography.Encoding.xml", "ref/netstandard1.3/zh-hans/System.Security.Cryptography.Encoding.xml", "ref/netstandard1.3/zh-hant/System.Security.Cryptography.Encoding.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll", "runtimes/win/lib/net46/System.Security.Cryptography.Encoding.dll", "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll" ] }, "System.Security.Cryptography.OpenSsl/4.0.0": { "sha512": "l21X5xtcXvWZVW/dnkbqg2e47Was2HLQRz76ZEUnFMiUhbF2FREiq5mH2PPA1GbTlYqRv4dfh25MN0HWgk0HXQ==", "type": "package", "path": "System.Security.Cryptography.OpenSsl/4.0.0", "files": [ "System.Security.Cryptography.OpenSsl.4.0.0.nupkg.sha512", "System.Security.Cryptography.OpenSsl.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll", "ref/netstandard1.6/System.Security.Cryptography.OpenSsl.dll", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll" ] }, "System.Security.Cryptography.Primitives/4.0.0": { "sha512": "xWq6qtYC6/0ZeT+WUDLgp6GFuVh2uKRgd5wgRyRrbJVmaq+rmR6UKWCCbPRxvEEFGgSJKZ2RHZ5ekOr0FcS+zA==", "type": "package", "path": "System.Security.Cryptography.Primitives/4.0.0", "files": [ "System.Security.Cryptography.Primitives.4.0.0.nupkg.sha512", "System.Security.Cryptography.Primitives.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Primitives.dll", "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Primitives.dll", "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Security.Cryptography.X509Certificates/4.1.0": { "sha512": "IA9bQFs61BaOEqvXSr7kGixlxySdehm4ot9ng1a7Vj3zaLkPhQCCaLWgqRPdI0fUD3dlKVypbb9WcAIjiSj8MQ==", "type": "package", "path": "System.Security.Cryptography.X509Certificates/4.1.0", "files": [ "System.Security.Cryptography.X509Certificates.4.1.0.nupkg.sha512", "System.Security.Cryptography.X509Certificates.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.X509Certificates.dll", "lib/net461/System.Security.Cryptography.X509Certificates.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.X509Certificates.dll", "ref/net461/System.Security.Cryptography.X509Certificates.dll", "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.dll", "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/de/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/es/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/fr/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/it/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/ja/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/ko/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/ru/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/zh-hans/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/zh-hant/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll", "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/de/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/es/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/fr/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/it/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/ja/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/ko/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/ru/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/zh-hans/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.4/zh-hant/System.Security.Cryptography.X509Certificates.xml", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/net46/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/net461/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/netcore50/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll" ] }, "System.Text.Encoding/4.0.11": { "sha512": "n+qkz6pjbVLAJSe18w3aAMP0TwJYbl+OwwI9xcB+B4l8uDWBLwssJmiEf0u51LSbo7S8Bapul40sYcUQw+BCRw==", "type": "package", "path": "System.Text.Encoding/4.0.11", "files": [ "System.Text.Encoding.4.0.11.nupkg.sha512", "System.Text.Encoding.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Text.Encoding.dll", "ref/netcore50/System.Text.Encoding.xml", "ref/netcore50/de/System.Text.Encoding.xml", "ref/netcore50/es/System.Text.Encoding.xml", "ref/netcore50/fr/System.Text.Encoding.xml", "ref/netcore50/it/System.Text.Encoding.xml", "ref/netcore50/ja/System.Text.Encoding.xml", "ref/netcore50/ko/System.Text.Encoding.xml", "ref/netcore50/ru/System.Text.Encoding.xml", "ref/netcore50/zh-hans/System.Text.Encoding.xml", "ref/netcore50/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.0/System.Text.Encoding.dll", "ref/netstandard1.0/System.Text.Encoding.xml", "ref/netstandard1.0/de/System.Text.Encoding.xml", "ref/netstandard1.0/es/System.Text.Encoding.xml", "ref/netstandard1.0/fr/System.Text.Encoding.xml", "ref/netstandard1.0/it/System.Text.Encoding.xml", "ref/netstandard1.0/ja/System.Text.Encoding.xml", "ref/netstandard1.0/ko/System.Text.Encoding.xml", "ref/netstandard1.0/ru/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", "ref/netstandard1.3/System.Text.Encoding.dll", "ref/netstandard1.3/System.Text.Encoding.xml", "ref/netstandard1.3/de/System.Text.Encoding.xml", "ref/netstandard1.3/es/System.Text.Encoding.xml", "ref/netstandard1.3/fr/System.Text.Encoding.xml", "ref/netstandard1.3/it/System.Text.Encoding.xml", "ref/netstandard1.3/ja/System.Text.Encoding.xml", "ref/netstandard1.3/ko/System.Text.Encoding.xml", "ref/netstandard1.3/ru/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Text.Encoding.Extensions/4.0.11": { "sha512": "tTo36p3sK3IjoMt6ALr+CVoO+gyVd69ykGXschYsQUUWjcxhq/TnD1ACIYtfzxxq+Tcg4Zoiw295kFmapXMROw==", "type": "package", "path": "System.Text.Encoding.Extensions/4.0.11", "files": [ "System.Text.Encoding.Extensions.4.0.11.nupkg.sha512", "System.Text.Encoding.Extensions.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Text.Encoding.Extensions.dll", "ref/netcore50/System.Text.Encoding.Extensions.xml", "ref/netcore50/de/System.Text.Encoding.Extensions.xml", "ref/netcore50/es/System.Text.Encoding.Extensions.xml", "ref/netcore50/fr/System.Text.Encoding.Extensions.xml", "ref/netcore50/it/System.Text.Encoding.Extensions.xml", "ref/netcore50/ja/System.Text.Encoding.Extensions.xml", "ref/netcore50/ko/System.Text.Encoding.Extensions.xml", "ref/netcore50/ru/System.Text.Encoding.Extensions.xml", "ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml", "ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/System.Text.Encoding.Extensions.dll", "ref/netstandard1.0/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml", "ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/System.Text.Encoding.Extensions.dll", "ref/netstandard1.3/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml", "ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Text.RegularExpressions/4.1.0": { "sha512": "YvaewnYFFkqF1LCRmg0/nVBk3eLSP/Oz+XWR50mW0sBHZHOOL7tIdw0F4aXPnHx5udlTpfkhwY2XaIhB0qGnBg==", "type": "package", "path": "System.Text.RegularExpressions/4.1.0", "files": [ "System.Text.RegularExpressions.4.1.0.nupkg.sha512", "System.Text.RegularExpressions.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/net463/System.Text.RegularExpressions.dll", "lib/netcore50/System.Text.RegularExpressions.dll", "lib/netstandard1.6/System.Text.RegularExpressions.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/net463/System.Text.RegularExpressions.dll", "ref/netcore50/System.Text.RegularExpressions.dll", "ref/netcore50/System.Text.RegularExpressions.xml", "ref/netcore50/de/System.Text.RegularExpressions.xml", "ref/netcore50/es/System.Text.RegularExpressions.xml", "ref/netcore50/fr/System.Text.RegularExpressions.xml", "ref/netcore50/it/System.Text.RegularExpressions.xml", "ref/netcore50/ja/System.Text.RegularExpressions.xml", "ref/netcore50/ko/System.Text.RegularExpressions.xml", "ref/netcore50/ru/System.Text.RegularExpressions.xml", "ref/netcore50/zh-hans/System.Text.RegularExpressions.xml", "ref/netcore50/zh-hant/System.Text.RegularExpressions.xml", "ref/netstandard1.0/System.Text.RegularExpressions.dll", "ref/netstandard1.0/System.Text.RegularExpressions.xml", "ref/netstandard1.0/de/System.Text.RegularExpressions.xml", "ref/netstandard1.0/es/System.Text.RegularExpressions.xml", "ref/netstandard1.0/fr/System.Text.RegularExpressions.xml", "ref/netstandard1.0/it/System.Text.RegularExpressions.xml", "ref/netstandard1.0/ja/System.Text.RegularExpressions.xml", "ref/netstandard1.0/ko/System.Text.RegularExpressions.xml", "ref/netstandard1.0/ru/System.Text.RegularExpressions.xml", "ref/netstandard1.0/zh-hans/System.Text.RegularExpressions.xml", "ref/netstandard1.0/zh-hant/System.Text.RegularExpressions.xml", "ref/netstandard1.3/System.Text.RegularExpressions.dll", "ref/netstandard1.3/System.Text.RegularExpressions.xml", "ref/netstandard1.3/de/System.Text.RegularExpressions.xml", "ref/netstandard1.3/es/System.Text.RegularExpressions.xml", "ref/netstandard1.3/fr/System.Text.RegularExpressions.xml", "ref/netstandard1.3/it/System.Text.RegularExpressions.xml", "ref/netstandard1.3/ja/System.Text.RegularExpressions.xml", "ref/netstandard1.3/ko/System.Text.RegularExpressions.xml", "ref/netstandard1.3/ru/System.Text.RegularExpressions.xml", "ref/netstandard1.3/zh-hans/System.Text.RegularExpressions.xml", "ref/netstandard1.3/zh-hant/System.Text.RegularExpressions.xml", "ref/netstandard1.6/System.Text.RegularExpressions.dll", "ref/netstandard1.6/System.Text.RegularExpressions.xml", "ref/netstandard1.6/de/System.Text.RegularExpressions.xml", "ref/netstandard1.6/es/System.Text.RegularExpressions.xml", "ref/netstandard1.6/fr/System.Text.RegularExpressions.xml", "ref/netstandard1.6/it/System.Text.RegularExpressions.xml", "ref/netstandard1.6/ja/System.Text.RegularExpressions.xml", "ref/netstandard1.6/ko/System.Text.RegularExpressions.xml", "ref/netstandard1.6/ru/System.Text.RegularExpressions.xml", "ref/netstandard1.6/zh-hans/System.Text.RegularExpressions.xml", "ref/netstandard1.6/zh-hant/System.Text.RegularExpressions.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Threading/4.0.11": { "sha512": "TkrlS3NzOXjdG9m4bGErvcxc7ILYmKKV9orf/JIdXXyT8nDd6hbU8iGMhHQNGKLhFup8NWuLBrNlPKrBjv/hrg==", "type": "package", "path": "System.Threading/4.0.11", "files": [ "System.Threading.4.0.11.nupkg.sha512", "System.Threading.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Threading.dll", "lib/netstandard1.3/System.Threading.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.dll", "ref/netcore50/System.Threading.xml", "ref/netcore50/de/System.Threading.xml", "ref/netcore50/es/System.Threading.xml", "ref/netcore50/fr/System.Threading.xml", "ref/netcore50/it/System.Threading.xml", "ref/netcore50/ja/System.Threading.xml", "ref/netcore50/ko/System.Threading.xml", "ref/netcore50/ru/System.Threading.xml", "ref/netcore50/zh-hans/System.Threading.xml", "ref/netcore50/zh-hant/System.Threading.xml", "ref/netstandard1.0/System.Threading.dll", "ref/netstandard1.0/System.Threading.xml", "ref/netstandard1.0/de/System.Threading.xml", "ref/netstandard1.0/es/System.Threading.xml", "ref/netstandard1.0/fr/System.Threading.xml", "ref/netstandard1.0/it/System.Threading.xml", "ref/netstandard1.0/ja/System.Threading.xml", "ref/netstandard1.0/ko/System.Threading.xml", "ref/netstandard1.0/ru/System.Threading.xml", "ref/netstandard1.0/zh-hans/System.Threading.xml", "ref/netstandard1.0/zh-hant/System.Threading.xml", "ref/netstandard1.3/System.Threading.dll", "ref/netstandard1.3/System.Threading.xml", "ref/netstandard1.3/de/System.Threading.xml", "ref/netstandard1.3/es/System.Threading.xml", "ref/netstandard1.3/fr/System.Threading.xml", "ref/netstandard1.3/it/System.Threading.xml", "ref/netstandard1.3/ja/System.Threading.xml", "ref/netstandard1.3/ko/System.Threading.xml", "ref/netstandard1.3/ru/System.Threading.xml", "ref/netstandard1.3/zh-hans/System.Threading.xml", "ref/netstandard1.3/zh-hant/System.Threading.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._", "runtimes/aot/lib/netcore50/System.Threading.dll" ] }, "System.Threading.Tasks/4.0.11": { "sha512": "AShEL6v4KgMjaM9Las2ayUNqiSphx2mdRItMmUzfu8l15KCECcRLWgbGPoY17nqyMQV4W8kO7sjAq3IU9wFCJA==", "type": "package", "path": "System.Threading.Tasks/4.0.11", "files": [ "System.Threading.Tasks.4.0.11.nupkg.sha512", "System.Threading.Tasks.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Threading.Tasks.dll", "ref/netcore50/System.Threading.Tasks.xml", "ref/netcore50/de/System.Threading.Tasks.xml", "ref/netcore50/es/System.Threading.Tasks.xml", "ref/netcore50/fr/System.Threading.Tasks.xml", "ref/netcore50/it/System.Threading.Tasks.xml", "ref/netcore50/ja/System.Threading.Tasks.xml", "ref/netcore50/ko/System.Threading.Tasks.xml", "ref/netcore50/ru/System.Threading.Tasks.xml", "ref/netcore50/zh-hans/System.Threading.Tasks.xml", "ref/netcore50/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.0/System.Threading.Tasks.dll", "ref/netstandard1.0/System.Threading.Tasks.xml", "ref/netstandard1.0/de/System.Threading.Tasks.xml", "ref/netstandard1.0/es/System.Threading.Tasks.xml", "ref/netstandard1.0/fr/System.Threading.Tasks.xml", "ref/netstandard1.0/it/System.Threading.Tasks.xml", "ref/netstandard1.0/ja/System.Threading.Tasks.xml", "ref/netstandard1.0/ko/System.Threading.Tasks.xml", "ref/netstandard1.0/ru/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", "ref/netstandard1.3/System.Threading.Tasks.dll", "ref/netstandard1.3/System.Threading.Tasks.xml", "ref/netstandard1.3/de/System.Threading.Tasks.xml", "ref/netstandard1.3/es/System.Threading.Tasks.xml", "ref/netstandard1.3/fr/System.Threading.Tasks.xml", "ref/netstandard1.3/it/System.Threading.Tasks.xml", "ref/netstandard1.3/ja/System.Threading.Tasks.xml", "ref/netstandard1.3/ko/System.Threading.Tasks.xml", "ref/netstandard1.3/ru/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Threading.Tasks.Extensions/4.0.0": { "sha512": "Pz5tyPagGf3nA2np2dQmRShxorlxRcvzBEFdYYuW7t0BbJaAuIMiBzRQ5ews7aIkdILwn293Wq5viLh3pm0MeQ==", "type": "package", "path": "System.Threading.Tasks.Extensions/4.0.0", "files": [ "System.Threading.Tasks.Extensions.4.0.0.nupkg.sha512", "System.Threading.Tasks.Extensions.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml" ] }, "System.Threading.Timer/4.0.1": { "sha512": "nHIn2bIQvEjQw8mXh3uu3DH6Gef8e+c3Mc0zBjz9XhGb7WewZ46JSo8EPmUQ++MLGNBGrXHhz0bZvmDum7MO1Q==", "type": "package", "path": "System.Threading.Timer/4.0.1", "files": [ "System.Threading.Timer.4.0.1.nupkg.sha512", "System.Threading.Timer.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net451/_._", "lib/portable-net451+win81+wpa81/_._", "lib/win81/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net451/_._", "ref/netcore50/System.Threading.Timer.dll", "ref/netcore50/System.Threading.Timer.xml", "ref/netcore50/de/System.Threading.Timer.xml", "ref/netcore50/es/System.Threading.Timer.xml", "ref/netcore50/fr/System.Threading.Timer.xml", "ref/netcore50/it/System.Threading.Timer.xml", "ref/netcore50/ja/System.Threading.Timer.xml", "ref/netcore50/ko/System.Threading.Timer.xml", "ref/netcore50/ru/System.Threading.Timer.xml", "ref/netcore50/zh-hans/System.Threading.Timer.xml", "ref/netcore50/zh-hant/System.Threading.Timer.xml", "ref/netstandard1.2/System.Threading.Timer.dll", "ref/netstandard1.2/System.Threading.Timer.xml", "ref/netstandard1.2/de/System.Threading.Timer.xml", "ref/netstandard1.2/es/System.Threading.Timer.xml", "ref/netstandard1.2/fr/System.Threading.Timer.xml", "ref/netstandard1.2/it/System.Threading.Timer.xml", "ref/netstandard1.2/ja/System.Threading.Timer.xml", "ref/netstandard1.2/ko/System.Threading.Timer.xml", "ref/netstandard1.2/ru/System.Threading.Timer.xml", "ref/netstandard1.2/zh-hans/System.Threading.Timer.xml", "ref/netstandard1.2/zh-hant/System.Threading.Timer.xml", "ref/portable-net451+win81+wpa81/_._", "ref/win81/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Xml.ReaderWriter/4.0.11": { "sha512": "bAPmrelFLVsxSCVLxNBqK/WoJjdad88EiJhZiV38K9EcGAUWYHo5a3lKTppqZqSiefq9gjFLz53JWS+pV/ZGIg==", "type": "package", "path": "System.Xml.ReaderWriter/4.0.11", "files": [ "System.Xml.ReaderWriter.4.0.11.nupkg.sha512", "System.Xml.ReaderWriter.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Xml.ReaderWriter.dll", "lib/netstandard1.3/System.Xml.ReaderWriter.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Xml.ReaderWriter.dll", "ref/netcore50/System.Xml.ReaderWriter.xml", "ref/netcore50/de/System.Xml.ReaderWriter.xml", "ref/netcore50/es/System.Xml.ReaderWriter.xml", "ref/netcore50/fr/System.Xml.ReaderWriter.xml", "ref/netcore50/it/System.Xml.ReaderWriter.xml", "ref/netcore50/ja/System.Xml.ReaderWriter.xml", "ref/netcore50/ko/System.Xml.ReaderWriter.xml", "ref/netcore50/ru/System.Xml.ReaderWriter.xml", "ref/netcore50/zh-hans/System.Xml.ReaderWriter.xml", "ref/netcore50/zh-hant/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/System.Xml.ReaderWriter.dll", "ref/netstandard1.0/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/de/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/es/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/fr/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/it/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/ja/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/ko/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/ru/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/zh-hans/System.Xml.ReaderWriter.xml", "ref/netstandard1.0/zh-hant/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/System.Xml.ReaderWriter.dll", "ref/netstandard1.3/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/de/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/es/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/fr/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/it/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/ja/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/ko/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/ru/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/zh-hans/System.Xml.ReaderWriter.xml", "ref/netstandard1.3/zh-hant/System.Xml.ReaderWriter.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] }, "System.Xml.XDocument/4.0.11": { "sha512": "SvNGKdBIH7G8JOUnzdMaWN4/eUCCkiR6eDMHo7/EzgXCJYqMNATMTFkMI/u7uJnxQYuMAyRIBWUWY4HLtL6ygw==", "type": "package", "path": "System.Xml.XDocument/4.0.11", "files": [ "System.Xml.XDocument.4.0.11.nupkg.sha512", "System.Xml.XDocument.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", "lib/netcore50/System.Xml.XDocument.dll", "lib/netstandard1.3/System.Xml.XDocument.dll", "lib/portable-net45+win8+wp8+wpa81/_._", "lib/win8/_._", "lib/wp80/_._", "lib/wpa81/_._", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", "lib/xamarinwatchos10/_._", "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", "ref/netcore50/System.Xml.XDocument.dll", "ref/netcore50/System.Xml.XDocument.xml", "ref/netcore50/de/System.Xml.XDocument.xml", "ref/netcore50/es/System.Xml.XDocument.xml", "ref/netcore50/fr/System.Xml.XDocument.xml", "ref/netcore50/it/System.Xml.XDocument.xml", "ref/netcore50/ja/System.Xml.XDocument.xml", "ref/netcore50/ko/System.Xml.XDocument.xml", "ref/netcore50/ru/System.Xml.XDocument.xml", "ref/netcore50/zh-hans/System.Xml.XDocument.xml", "ref/netcore50/zh-hant/System.Xml.XDocument.xml", "ref/netstandard1.0/System.Xml.XDocument.dll", "ref/netstandard1.0/System.Xml.XDocument.xml", "ref/netstandard1.0/de/System.Xml.XDocument.xml", "ref/netstandard1.0/es/System.Xml.XDocument.xml", "ref/netstandard1.0/fr/System.Xml.XDocument.xml", "ref/netstandard1.0/it/System.Xml.XDocument.xml", "ref/netstandard1.0/ja/System.Xml.XDocument.xml", "ref/netstandard1.0/ko/System.Xml.XDocument.xml", "ref/netstandard1.0/ru/System.Xml.XDocument.xml", "ref/netstandard1.0/zh-hans/System.Xml.XDocument.xml", "ref/netstandard1.0/zh-hant/System.Xml.XDocument.xml", "ref/netstandard1.3/System.Xml.XDocument.dll", "ref/netstandard1.3/System.Xml.XDocument.xml", "ref/netstandard1.3/de/System.Xml.XDocument.xml", "ref/netstandard1.3/es/System.Xml.XDocument.xml", "ref/netstandard1.3/fr/System.Xml.XDocument.xml", "ref/netstandard1.3/it/System.Xml.XDocument.xml", "ref/netstandard1.3/ja/System.Xml.XDocument.xml", "ref/netstandard1.3/ko/System.Xml.XDocument.xml", "ref/netstandard1.3/ru/System.Xml.XDocument.xml", "ref/netstandard1.3/zh-hans/System.Xml.XDocument.xml", "ref/netstandard1.3/zh-hant/System.Xml.XDocument.xml", "ref/portable-net45+win8+wp8+wpa81/_._", "ref/win8/_._", "ref/wp80/_._", "ref/wpa81/_._", "ref/xamarinios10/_._", "ref/xamarinmac20/_._", "ref/xamarintvos10/_._", "ref/xamarinwatchos10/_._" ] } }, "projectFileDependencyGroups": { "": [ "NETStandard.Library >= 1.6.0", "Newtonsoft.Json >= 9.0.1" ], ".NETStandard,Version=v1.6": [] }, "tools": {}, "projectFileToolGroups": {} } ================================================ FILE: Foundation.Architecture/Architecture.Core.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Architecture.Core", "Architecture.Core\Architecture.Core.xproj", "{0CAFB5CC-49CC-4665-A226-99DF505C6A46}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|ARM = Release|ARM Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Debug|Any CPU.Build.0 = Debug|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Debug|ARM.ActiveCfg = Debug|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Debug|ARM.Build.0 = Debug|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Debug|x64.ActiveCfg = Debug|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Debug|x64.Build.0 = Debug|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Debug|x86.ActiveCfg = Debug|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Debug|x86.Build.0 = Debug|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Release|Any CPU.ActiveCfg = Release|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Release|Any CPU.Build.0 = Release|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Release|ARM.ActiveCfg = Release|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Release|ARM.Build.0 = Release|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Release|x64.ActiveCfg = Release|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Release|x64.Build.0 = Release|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Release|x86.ActiveCfg = Release|Any CPU {0CAFB5CC-49CC-4665-A226-99DF505C6A46}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: Foundation.Architecture/Architecture.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Architecture", "Architecture\Architecture.csproj", "{F38F800F-D4D8-48E4-9A2C-B0518BE831CB}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DCB94898-CCFD-48D3-9FA5-C18363617A80}" ProjectSection(SolutionItems) = preProject Injector.md = Injector.md README.md = README.md EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{7F010A24-7AB3-4EF0-9104-32B3A6E55073}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Architecture.Unity3d", "Architecture\Architecture.Unity3d.csproj", "{5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Architecture.Tests", "Tests\Architecture.Tests.csproj", "{521C4991-F9C6-4BC3-800C-227E7E365CCF}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Architecture.WebGL", "Architecture\Architecture.WebGL.csproj", "{7238EC8C-9378-4369-BEA9-07D774F6C104}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|ARM = Release|ARM Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Debug|Any CPU.Build.0 = Debug|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Debug|ARM.ActiveCfg = Debug|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Debug|ARM.Build.0 = Debug|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Debug|x64.ActiveCfg = Debug|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Debug|x64.Build.0 = Debug|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Debug|x86.ActiveCfg = Debug|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Debug|x86.Build.0 = Debug|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Release|Any CPU.ActiveCfg = Release|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Release|Any CPU.Build.0 = Release|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Release|ARM.ActiveCfg = Release|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Release|ARM.Build.0 = Release|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Release|x64.ActiveCfg = Release|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Release|x64.Build.0 = Release|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Release|x86.ActiveCfg = Release|Any CPU {F38F800F-D4D8-48E4-9A2C-B0518BE831CB}.Release|x86.Build.0 = Release|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Debug|Any CPU.Build.0 = Debug|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Debug|ARM.ActiveCfg = Debug|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Debug|ARM.Build.0 = Debug|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Debug|x64.ActiveCfg = Debug|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Debug|x64.Build.0 = Debug|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Debug|x86.ActiveCfg = Debug|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Debug|x86.Build.0 = Debug|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Release|Any CPU.ActiveCfg = Release|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Release|Any CPU.Build.0 = Release|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Release|ARM.ActiveCfg = Release|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Release|ARM.Build.0 = Release|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Release|x64.ActiveCfg = Release|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Release|x64.Build.0 = Release|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Release|x86.ActiveCfg = Release|Any CPU {5DDB2AF5-1DB0-43D1-97B7-654E5D75F42F}.Release|x86.Build.0 = Release|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Debug|Any CPU.Build.0 = Debug|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Debug|ARM.ActiveCfg = Debug|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Debug|ARM.Build.0 = Debug|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Debug|x64.ActiveCfg = Debug|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Debug|x64.Build.0 = Debug|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Debug|x86.ActiveCfg = Debug|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Debug|x86.Build.0 = Debug|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Release|Any CPU.ActiveCfg = Release|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Release|Any CPU.Build.0 = Release|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Release|ARM.ActiveCfg = Release|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Release|ARM.Build.0 = Release|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Release|x64.ActiveCfg = Release|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Release|x64.Build.0 = Release|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Release|x86.ActiveCfg = Release|Any CPU {521C4991-F9C6-4BC3-800C-227E7E365CCF}.Release|x86.Build.0 = Release|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Debug|Any CPU.Build.0 = Debug|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Debug|ARM.ActiveCfg = Debug|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Debug|ARM.Build.0 = Debug|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Debug|x64.ActiveCfg = Debug|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Debug|x64.Build.0 = Debug|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Debug|x86.ActiveCfg = Debug|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Debug|x86.Build.0 = Debug|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Release|Any CPU.ActiveCfg = Release|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Release|Any CPU.Build.0 = Release|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Release|ARM.ActiveCfg = Release|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Release|ARM.Build.0 = Release|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Release|x64.ActiveCfg = Release|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Release|x64.Build.0 = Release|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Release|x86.ActiveCfg = Release|Any CPU {7238EC8C-9378-4369-BEA9-07D774F6C104}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {521C4991-F9C6-4BC3-800C-227E7E365CCF} = {7F010A24-7AB3-4EF0-9104-32B3A6E55073} EndGlobalSection EndGlobal ================================================ FILE: Foundation.Architecture/Tests/Architecture.Tests.csproj ================================================  Debug AnyCPU {521C4991-F9C6-4BC3-800C-227E7E365CCF} Library Properties Foundation.Architecture.Tests Foundation.Architecture.Tests v4.5.2 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True {f38f800f-d4d8-48e4-9a2c-b0518be831cb} Architecture False False False False ================================================ FILE: Foundation.Architecture/Tests/BufferHelperTests.cs ================================================ using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Foundation.Architecture.Tests { [TestClass] public class BufferHelperTests { [TestMethod] public void TestInt() { var buffer = new byte[sizeof(int)]; BufferHelper.Write(buffer, 0, 69); var val = BufferHelper.ReadInt32(buffer, 0); Assert.AreEqual(val, 69); } [TestMethod] public void TestShort() { var buffer = new byte[sizeof(ushort)]; BufferHelper.Write(buffer, 0, (ushort)69); var val = BufferHelper.ReadUInt16(buffer, 0); Assert.AreEqual(val, 69); } [TestMethod] public void TestFloat() { var buffer = new byte[sizeof(float)]; BufferHelper.Write(buffer, 0, 69f); var val = BufferHelper.ReadFloat(buffer, 0); Assert.AreEqual(val, 69f); } [TestMethod] public void TestString() { var str = "Hello World BLAH BLAH"; var buffer = new byte[(sizeof(char) * str.Length) + sizeof(ushort)]; BufferHelper.Write(buffer, 0, str); var val = BufferHelper.ReadString(buffer, 0); Assert.AreEqual(val, str); } [TestMethod] public void TestBadRead() { try { var buffer = new byte[sizeof(float)]; BufferHelper.Write(buffer, 0, 69f); var val = BufferHelper.ReadFloat(buffer, 0); val = BufferHelper.ReadFloat(buffer, sizeof(float)); Assert.Fail("Should of Failed"); } catch (Exception ex) { Assert.IsInstanceOfType(ex, typeof(ArgumentException)); } } [TestMethod] public void TestBadWrite() { try { var buffer = new byte[sizeof(float)]; BufferHelper.Write(buffer, 0, 69f); BufferHelper.Write(buffer, sizeof(float), 69f); Assert.Fail("Should of Failed"); } catch (Exception ex) { Assert.IsInstanceOfType(ex, typeof(ArgumentException)); } } } } ================================================ FILE: Foundation.Architecture/Tests/DomainEventsTest.cs ================================================ using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Foundation.Architecture.Tests { [TestClass] public class DomainEventsTest { public class Msg { public string Content { get; set; } } const string MagicString = "Hello World"; private int counter = 0; [TestCleanup] public void Cleanup() { counter = 0; } [TestMethod] public void TestSubscribe() { //Define a message class to send var msg = new Msg {Content = MagicString}; //subscribe you handlers DomainEvents.Subscribe(Handler); //maby ways to send DomainEvents.Publish(msg); DomainEvents.Publish(msg); DomainEvents.Publish(msg, typeof(Msg)); Assert.AreEqual(counter, 3); //unsubcribe when done as we are not using weakreferences internally DomainEvents.Unsubscribe(Handler); DomainEvents.Publish(msg); Assert.AreEqual(counter, 3); } [TestMethod] public void TestAddEvent() { var msg = new Msg { Content = MagicString }; DomainEvents.OnMessage += Handler; DomainEvents.Publish(msg); DomainEvents.Publish(msg); DomainEvents.Publish(msg, typeof(Msg)); Assert.AreEqual(counter, 3); DomainEvents.Unsubscribe(Handler); DomainEvents.Publish(msg); Assert.AreEqual(counter, 3); } public void Handler(Msg myMessage) { Assert.AreEqual(myMessage.Content, MagicString); counter++; } } } ================================================ FILE: Foundation.Architecture/Tests/InjectorTests.cs ================================================ using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Foundation.Architecture.Tests { [TestClass] public class InjectorTests { [TestInitialize] public void TestInitialize() { InjectService.UnregisterAll(); } [TestCleanup] public void TestCleanup() { InjectService.UnregisterAll(); } [TestMethod] public void TestTransient() { //Register a concrete type keyed by an interface InjectService.RegisterTransient(); InjectService.RegisterTransient(); InjectService.RegisterTransient(); var document = InjectService.Get(); Assert.IsNotNull(document); Assert.IsNotNull(document.Sentances); Assert.IsNotNull(document.Words); Assert.AreEqual(document.Print(), document.Sentances.GetSentance()); } [TestMethod] public void TestTransient2() { //Not we are not using the interface here InjectService.RegisterTransient(); Assert.IsNotNull(InjectService.Get()); InjectService.RegisterTransient(() => new SentanceService()); Assert.IsNotNull(InjectService.Get()); } [TestMethod] public void TestSingleton() { InjectService.RegisterSingleton(); InjectService.RegisterSingleton(); InjectService.RegisterSingleton(); var document = InjectService.Get(); Assert.IsNotNull(document); Assert.IsNotNull(document.Sentances); Assert.IsNotNull(document.Words); Assert.AreEqual(document.Print(), document.Sentances.GetSentance()); var document2 = InjectService.Get(); Assert.AreEqual(document, document2); Assert.AreEqual(document.Words, document2.Words); Assert.AreEqual(document.Sentances, document2.Sentances); } [TestMethod] public void TestSingleton2() { // Note we are NOT using the interface here // Since we use a dictionary internally, these are keyed by the concrete type only. // We can make the InjectService more flexible, but, that would be a performance hit. InjectService.RegisterSingleton(); Assert.IsNotNull(InjectService.Get()); InjectService.RegisterSingleton(() => new SentanceService()); Assert.IsNotNull(InjectService.Get()); InjectService.RegisterSingleton(new Document()); Assert.IsNotNull(InjectService.Get()); InjectService.UnregisterAll(); InjectService.RegisterSingleton(new WordService()); Assert.IsNotNull(InjectService.Get()); InjectService.RegisterSingleton(() => new SentanceService()); Assert.IsNotNull(InjectService.Get()); } [TestMethod] public void TestRemove() { InjectService.RegisterTransient(); InjectService.RegisterTransient(); InjectService.RegisterTransient(); InjectService.Unregister(); var document = InjectService.Get(); Assert.IsNull(document); InjectService.UnregisterAll(); Assert.IsNull(InjectService.Get()); Assert.IsNull(InjectService.Get()); } [TestMethod] public void TestNull() { var document = InjectService.Get(); Assert.IsNull(document); } [TestMethod] public void TestPrint() { InjectService.RegisterSingleton(); InjectService.RegisterSingleton(); InjectService.RegisterSingleton(); var log = InjectService.Print(); Assert.IsTrue(log.Count() == 3); } } } ================================================ FILE: Foundation.Architecture/Tests/ObjectEventsTest.cs ================================================ using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Foundation.Architecture.Tests { [TestClass] public class ObjectEventsTest { public class Msg { public string Content { get; set; } } public class GameObject { } const string MagicString = "Hello World"; private int counter = 0; [TestCleanup] public void Cleanup() { counter = 0; } [TestMethod] public void TestStringRoute() { var msg = new Msg {Content = MagicString}; var route = "Users/NVenti"; ObjectEvents.Subscribe(route, Handler); ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg, typeof(string), typeof(Msg)); Assert.AreEqual(counter, 3); //bad route ObjectEvents.Publish(route +route, msg, typeof(string), typeof(Msg)); ObjectEvents.Unsubscribe(route, Handler); ObjectEvents.Publish(route, msg); Assert.AreEqual(counter, 3); ObjectEvents.Subscribe(route, Handler); ObjectEvents.Unsubscribe(route); ObjectEvents.Publish(route, msg); Assert.AreEqual(counter, 3); } [TestMethod] public void TestObjectRoute() { //define out message, a class var msg = new Msg { Content = MagicString }; //define our routes (strings or game objects or something else) var route = new GameObject(); var route2 = new GameObject(); //subscribe using the object reference ObjectEvents.Subscribe(route, Handler); //many ways to send ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg, typeof(GameObject), typeof(Msg)); Assert.AreEqual(counter, 3); //bad route ObjectEvents.Publish(route2, msg, typeof(GameObject), typeof(Msg)); //be sure to clean up as we are not using weak references ObjectEvents.Unsubscribe(route, Handler); ObjectEvents.Publish(route, msg); Assert.AreEqual(counter, 3); ObjectEvents.Subscribe(route, Handler); ObjectEvents.Unsubscribe(route); ObjectEvents.Publish(route, msg); Assert.AreEqual(counter, 3); } public void Handler(Msg myMessage) { Assert.AreEqual(myMessage.Content, MagicString); counter++; } } } ================================================ FILE: Foundation.Architecture/Tests/ObservableTests.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Foundation.Architecture.Tests { [TestClass] public class ObservableTests { public class ViewModel : ObservableObject { private string _myProperty2; public string MyProperty2 { get { return _myProperty2; } set { if (_myProperty2 == value) return; _myProperty2 = value; RaiseChange("MyProperty2", value); } } private int _myProperty; public int MyProperty { get { return _myProperty; } set { if (_myProperty == value) return; _myProperty = value; RaiseChange("MyProperty", value); } } public void MyCommand() { MyProperty++; } public void MyCommand2(int value) { MyProperty = (value + _myProperty); } } [TestMethod] public void TestObservableObject() { var vm = new ViewModel(); int counter = 0; vm.OnPublish += (name) => { Assert.AreEqual(name.Name, "MyProperty"); Assert.AreEqual(name.Sender, vm); Assert.AreEqual(name.Value, vm.MyProperty); counter++; }; vm.MyCommand(); Assert.AreEqual(vm.MyProperty, 1); vm.MyCommand2(2); Assert.AreEqual(vm.MyProperty, 3); vm.MyProperty = 0; Assert.AreEqual(vm.MyProperty, 0); Assert.AreEqual(counter, 3); } [TestMethod] public void TestObservableProxy() { var vm = new ViewModel(); var proxy = new ObservableProxy(vm); int counter2 = 0; int counter1 = 0; vm.OnPublish += (name) => { counter1++; }; proxy.OnPublish += (name) => { counter2++; }; proxy.Post("MyCommand"); Assert.AreEqual(vm.MyProperty, 1); proxy.Post("MyCommand2", 2); Assert.AreEqual(vm.MyProperty, 3); proxy.Post("MyProperty", 0); Assert.AreEqual(vm.MyProperty, 0); Assert.AreEqual(counter1, 3); Assert.AreEqual(counter2, 3); proxy.Dispose(); } [TestMethod] public void TestConversion() { var vm = new ViewModel(); var proxy = new ObservableProxy(vm); int counter2 = 0; int counter1 = 0; vm.OnPublish += (name) => { counter1++; }; proxy.OnPublish += (name) => { counter2++; }; proxy.Post("MyCommand"); Assert.AreEqual(vm.MyProperty, 1); proxy.Post("MyCommand2", "2"); Assert.AreEqual(vm.MyProperty, 3); proxy.Post("MyProperty", 0f); Assert.AreEqual(vm.MyProperty, 0); Assert.AreEqual(counter1, 3); Assert.AreEqual(counter2, 3); proxy.Post("MyProperty2", "1"); var temp = proxy.Get("MyProperty2"); Assert.AreEqual(temp, 1); proxy.Dispose(); } [TestMethod] public void TestObservable() { var vm = new ObservableProperty(); vm.Value = 10; int counter = 0; vm.OnPublish += (v) => { if(counter == 0) Assert.AreEqual(10, v); counter++; }; vm.Value = 0; vm.Value++; Assert.AreEqual(vm.Value, 1); vm.Value--; Assert.AreEqual(vm.Value, 0); vm.Value++; Assert.AreEqual(vm.Value, 1); Assert.AreEqual(counter, 5); } [TestMethod] public void TestList() { var vm = new ObservableList(); var v = new List(); Action test = () => { Assert.IsTrue(v.Count == vm.Count); for (int i = 0; i < v.Count; i++) { Assert.IsTrue(v[i] == vm[i]); } }; vm.OnPublish += (args) => { switch (args.Event) { case ListChangedEventType.Add: { foreach (var item in args.Items) { v.Add(item as string); } } break; case ListChangedEventType.Remove: { foreach (var item in args.Items) { v.Remove(item as string); } } break; case ListChangedEventType.Replace: { var index = v.IndexOf(args.Items.ElementAt(0) as string); if (index >= 0) { v[index] = args.Items.ElementAt(0) as string; } } break; case ListChangedEventType.Insert: { for (int j = 0; j < args.Items.Count(); j++) { v.Insert(j + args.Index, args.Items.ElementAt(j) as string); } } break; case ListChangedEventType.Clear: { v.Clear(); } break; case ListChangedEventType.Refresh: { //Nothing, flicker UI } break; } test(); }; vm.Add("0"); for (int i = 1; i < 100; i++) { vm.Add(i.ToString()); } for (int i = 1; i < 10; i++) { vm.Remove((i + 10).ToString()); } vm.AddRange(new[] { "11", "12", "13" }); vm.RemoveRange(new[] { "11", "12", "13" }); vm.Replace("99"); vm.Insert(3, "199"); var h = vm.IndexOf("21"); vm[h] = "21"; vm.Clear(); } [TestMethod] public void TestObservableMetrics() { var vm = new ViewModel(); var proxy = new ObservableProxy(vm); var watch = new Stopwatch(); long testNormal = long.MinValue; long testReflected = long.MinValue; long testProxy = long.MinValue; long testInvoke = long.MinValue; var invoke = (Action)Delegate.CreateDelegate(typeof(Action), vm, "MyCommand"); //Dry run first before real test for (int k = 0; k < 5; k++) { watch.Reset(); watch.Start(); for (int i = 0; i < 1000; i++) { vm.MyCommand(); } watch.Stop(); testNormal = watch.ElapsedTicks; watch.Reset(); watch.Start(); for (int i = 0; i < 1000; i++) { proxy.Post("MyCommand"); } watch.Stop(); testProxy = watch.ElapsedTicks; watch.Reset(); watch.Start(); for (int i = 0; i < 1000; i++) { invoke(); } watch.Stop(); testInvoke = watch.ElapsedTicks; watch.Reset(); watch.Start(); for (int i = 0; i < 1000; i++) { vm.GetType().GetMethod("MyCommand").Invoke(vm, null); } watch.Stop(); testReflected = watch.ElapsedTicks; } //Normal = 81 //Reflected = 1088 //Cached = 82 //Proxy = 507 Console.WriteLine("Normal = " + testNormal); Console.WriteLine("Reflected = " + testReflected); Console.WriteLine("Cached = " + testInvoke); Console.WriteLine("Proxy = " + testProxy); } } } ================================================ FILE: Foundation.Architecture/Tests/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Injector.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Injector.Tests")] [assembly: AssemblyCopyright("Copyright © 2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("521c4991-f9c6-4bc3-800c-227e7e365ccf")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: Foundation.Architecture/Tests/SerializerTests.cs ================================================ ================================================ FILE: Foundation.Architecture/Tests/TestModels.cs ================================================ namespace Foundation.Architecture.Tests { public interface IWordService { string GetWord(); } public interface ISentanceService { string GetSentance(); } public class WordService : IWordService { public string GetWord() { return "World"; } } public class SentanceService : ISentanceService { [Inject] public IWordService Words; public string GetSentance() { return "Hello "+Words.GetWord(); } } public class Document { [Inject] public ISentanceService Sentances; [Inject] public IWordService Words; public string Print() { return Sentances.GetSentance(); } } } ================================================ FILE: Foundation.Architecture/Tests/ThreadingTests.cs ================================================ using System; using System.Collections; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Foundation.Architecture.Tests { [TestClass] public class ThreadingTests { [TestCleanup] public void TestCleanup() { updateCounter = 0; } private double updateCounter; [TestMethod] public async Task TestUpdate() { var task = ThreadingService.RunUpdate(Update); await Task.Delay(1000); //Asset works Assert.IsTrue(updateCounter >= 900); task.Dispose(); var old = updateCounter; await Task.Delay(1000); //Asset Dispose works Assert.IsTrue(updateCounter == old); } void Update(double delta) { updateCounter += delta; } [TestMethod] public async Task TestDelay() { var task = ThreadingService.RunDelay(UpdateDelay, 1); await Task.Delay(500); //Asset Not early executed Assert.IsTrue(updateCounter == 0); await Task.Delay(1500); //Asset Executed in time Assert.IsTrue(updateCounter == 1); task.Dispose(); updateCounter = 0; task = ThreadingService.RunDelay(UpdateDelay, 1); await Task.Delay(500); task.Dispose(); await Task.Delay(1500); //asset early dispose Assert.IsTrue(updateCounter == 0); } void UpdateDelay() { updateCounter++; } [TestMethod] public async Task TestCoroutine() { updateCounter = 0; ThreadingService.RunRoutine(CoroutineAsync()); await Task.Delay(5000); Console.WriteLine(updateCounter); Assert.IsTrue(updateCounter == 5); } IEnumerator CoroutineAsync() { updateCounter++; yield return 1; updateCounter++; yield return 1; updateCounter++; yield return 1; updateCounter++; yield return 1; updateCounter++; yield return 1; } } } ================================================ FILE: Foundation.Architecture/Tests/packages.config ================================================  ================================================ FILE: Foundation.Unity/Assets/Binding/BindingComponenet.cs ================================================ using System; using UnityEngine; using System.Collections.Generic; using Foundation.Architecture; /// /// Represents a single property binding /// [Serializable] public class Binding { /// /// The specific member this binding is bound to /// [SerializeField] public string Member; /// /// Things we can bind to. /// Key value pair of MemberName x Member Description /// [HideInInspector] public Dictionary Members; /// /// The expected type / signiture of the member. /// /// /// All if empty or null, else white list /// [HideInInspector] public Type[] Constraints; } /// /// Base class for all binders /// [AddComponentMenu("PierPlay/Binding/BindingComponenet")] public class BindingComponenet : MonoBehaviour { /// /// Find Context override /// public Component Target; /// /// Collection of all bindings avaliable for targeting /// public List Bindings; /// /// The 'view model' we are bound to /// public ObservableProxy Context; // private IObservableView view; public void Init() { if (Target == null) FindTarget(); BindTarget(); } void FindTarget() { // Target = this.GetComponentInParent() as Component; } void BindTarget() { // if (view != null) // { // view.Unsubscribe(OnContext); // } // // view = Target as IObservableView; // if (view != null) // { // view.Subscribe(OnContext); // } } void OnContext(ObservableProxy proxy) { //if (Context != null) //{ // Context.OnPropertyChanged -= Context_OnPropertyChanged; //} //Context = proxy; //if (Context != null) //{ // Context.OnPropertyChanged += Context_OnPropertyChanged; //} } private void Context_OnPropertyChanged(string memberName) { if (Bindings == null) return; for (int i = 0; i < Bindings.Count; i++) { if (Bindings[i].Member == memberName) { OnChanged(memberName); return; } } } /// /// Handle any/all property changes here /// /// public virtual void OnChanged(string memberName) { } /// /// Post changes to the view model here /// /// /// public void Post(string memberName, object value = null) { if (Context == null) { return; } // Context.Set(); } } ================================================ FILE: Foundation.Unity/Assets/Binding/BindingComponenet.cs.meta ================================================ fileFormatVersion: 2 guid: ee7f19e4e318e1b4d9126087b78f9cf4 timeCreated: 1473380751 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Binding/IViewTarget.cs ================================================ using System; using Foundation.Architecture; ///// ///// Interface for getting a view model. Used by the view binder ///// ///// ///// Finding the correct model to bind to in hierarchy can get messy ///// //public interface IObservableView : IObservable //{ //} ================================================ FILE: Foundation.Unity/Assets/Binding/IViewTarget.cs.meta ================================================ fileFormatVersion: 2 guid: 323186f5224bd8f438a3b8da6ee75aed timeCreated: 1473388625 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Binding/View.cs ================================================ using System; using Foundation.Architecture; using UnityEngine; ///// ///// Put this on the root of everything with a view model. ///// //[AddComponentMenu("PierPlay/Binding/View")] //public class View : MonoBehaviour //{ // /// // /// Raised whenever the data model changes // /// // public event Action OnBinding; //} ///// ///// Put this on the root of everything with a view model. ///// //[AddComponentMenu("PierPlay/Binding/View")] //public class View : MonoBehaviour //{ // /// // /// Raised whenever the data model changes // /// // public event Action OnBinding; //} ================================================ FILE: Foundation.Unity/Assets/Binding/View.cs.meta ================================================ fileFormatVersion: 2 guid: 84cf8b98c34b6a948b6c1a4bd0b29519 timeCreated: 1473380744 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Binding.meta ================================================ fileFormatVersion: 2 guid: 3d2de8d5b30a3aa4dae13812f3457da9 folderAsset: yes timeCreated: 1473380702 licenseType: Free DefaultImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Plugins/Foundation.Architecture.Unity3d.dll.mdb.meta ================================================ fileFormatVersion: 2 guid: 2b49a5831a5db6049b9ff66f8a4c69dc timeCreated: 1473461926 licenseType: Free DefaultImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Plugins/Foundation.Architecture.Unity3d.dll.meta ================================================ fileFormatVersion: 2 guid: ab0227721ac21b54f9bf470ad8fab9fa timeCreated: 1473303897 licenseType: Free PluginImporter: serializedVersion: 1 iconMap: {} executionOrder: {} isPreloaded: 0 platformData: Android: enabled: 1 settings: CPU: AnyCPU Any: enabled: 0 settings: {} Editor: enabled: 1 settings: CPU: AnyCPU DefaultValueInitialized: true OS: AnyOS Linux: enabled: 1 settings: CPU: x86 Linux64: enabled: 1 settings: CPU: x86_64 LinuxUniversal: enabled: 1 settings: CPU: AnyCPU OSXIntel: enabled: 1 settings: CPU: AnyCPU OSXIntel64: enabled: 1 settings: CPU: AnyCPU OSXUniversal: enabled: 1 settings: CPU: AnyCPU Win: enabled: 1 settings: CPU: AnyCPU Win64: enabled: 1 settings: CPU: AnyCPU WindowsStoreApps: enabled: 0 settings: CPU: AnyCPU iOS: enabled: 1 settings: CompileFlags: FrameworkDependencies: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Plugins/Foundation.Architecture.Unity3d.pdb.meta ================================================ fileFormatVersion: 2 guid: 00ca4fedbb301114aad23ac0fb630300 timeCreated: 1473380534 licenseType: Free DefaultImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Plugins/Foundation.Architecture.WebGL.dll.meta ================================================ fileFormatVersion: 2 guid: 728180cb81fac194c9e8684be30e8fe6 timeCreated: 1473304321 licenseType: Free PluginImporter: serializedVersion: 1 iconMap: {} executionOrder: {} isPreloaded: 0 platformData: Android: enabled: 0 settings: CPU: AnyCPU Any: enabled: 0 settings: {} Editor: enabled: 0 settings: CPU: AnyCPU DefaultValueInitialized: true OS: AnyOS Linux: enabled: 0 settings: CPU: x86 Linux64: enabled: 0 settings: CPU: x86_64 OSXIntel: enabled: 0 settings: CPU: AnyCPU OSXIntel64: enabled: 0 settings: CPU: AnyCPU WebGL: enabled: 1 settings: {} Win: enabled: 0 settings: CPU: AnyCPU Win64: enabled: 0 settings: CPU: AnyCPU WindowsStoreApps: enabled: 0 settings: CPU: AnyCPU iOS: enabled: 0 settings: CompileFlags: FrameworkDependencies: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Plugins.meta ================================================ fileFormatVersion: 2 guid: c3aefe2b84b1d2a4d80e61abd5be628e folderAsset: yes timeCreated: 1473303895 licenseType: Free DefaultImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/Assert.cs ================================================ using System; using System.Diagnostics; using System.Linq; /// /// DOTNET Shim /// public class Assert { public static string GetMethodName() { // get call stack var stackTrace = new StackTrace(); // get method calls (frames) var stackFrames = stackTrace.GetFrames().ToList(); string n = String.Empty; for (int i = 0; i < stackFrames.Count; i++) { if (i == 0) continue; n = stackFrames[i].GetMethod().Name; if (n == "MoveNext") continue; break; } return n; } public static void IsNotNull(object o) { if (o == null) throw new Exception("IsNotNull Assertion Failed on " + GetMethodName()); } public static void AreEqual(T a, T b) { if (!a.Equals(b)) throw new Exception("AreEqual Assertion Failed on " + GetMethodName()); } public static void IsNull(object o) { if (o != null) throw new Exception("IsNull Assertion Failed on " + GetMethodName()); } public static void IsTrue(bool o) { if (!o) throw new Exception("IsTrue Assertion Failed on " + GetMethodName()); } public static void IsFalse(bool o) { if (!o) throw new Exception("IsFalse Assertion Failed on " + GetMethodName()); } public static void Fail(string o) { throw new Exception(o); } public static void IsInstanceOfType(object o, Type t) { if (o.GetType() != t) throw new Exception("IsInstanceOfType Assertion Failed on " + GetMethodName()); } } ================================================ FILE: Foundation.Unity/Assets/Tests/Assert.cs.meta ================================================ fileFormatVersion: 2 guid: 0244c8afafb4aed47a172a9af4c5091a timeCreated: 1473308412 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/BufferHelperTests.cs ================================================ using System; using Foundation.Architecture; using UnityEngine; [IntegrationTest.DynamicTest("TestScene")] [IntegrationTest.Timeout(10)] public class BufferHelperTests : MonoBehaviour { void Start() { TestMethod.RunAll(this, () => { }); } [TestMethod] public void TestInt() { var buffer = new byte[sizeof(int)]; BufferHelper.Write(buffer, 0, 69); var val = BufferHelper.ReadInt32(buffer, 0); Assert.AreEqual(val, 69); } [TestMethod] public void TestShort() { var buffer = new byte[sizeof(ushort)]; BufferHelper.Write(buffer, 0, (ushort)69); var val = BufferHelper.ReadUInt16(buffer, 0); Assert.AreEqual(val, 69); } [TestMethod] public void TestFloat() { var buffer = new byte[sizeof(float)]; BufferHelper.Write(buffer, 0, 69f); var val = BufferHelper.ReadFloat(buffer, 0); Assert.AreEqual(val, 69f); } [TestMethod] public void TestString() { var str = "Hello World BLAH BLAH"; var buffer = new byte[(sizeof(char) * str.Length) + sizeof(ushort)]; BufferHelper.Write(buffer, 0, str); var val = BufferHelper.ReadString(buffer, 0); Assert.AreEqual(val, str); } [TestMethod] public void TestBadRead() { try { var buffer = new byte[sizeof(float)]; BufferHelper.Write(buffer, 0, 69f); BufferHelper.ReadFloat(buffer, 0); BufferHelper.ReadFloat(buffer, sizeof(float)); Assert.Fail("Should of Failed"); } catch (Exception ex) { Assert.IsInstanceOfType(ex, typeof(ArgumentException)); } } [TestMethod] public void TestBadWrite() { try { var buffer = new byte[sizeof(float)]; BufferHelper.Write(buffer, 0, 69f); BufferHelper.Write(buffer, sizeof(float), 69f); Assert.Fail("Should of Failed"); } catch (Exception ex) { Assert.IsInstanceOfType(ex, typeof(ArgumentException)); } } } ================================================ FILE: Foundation.Unity/Assets/Tests/BufferHelperTests.cs.meta ================================================ fileFormatVersion: 2 guid: 7c7b769bf0b589747a79052f1dac102b timeCreated: 1473309957 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/DemoTest.cs ================================================ using UnityEngine; [IntegrationTest.DynamicTest("TestScene")] [IntegrationTest.Timeout(10)] public class DemoTest : MonoBehaviour { void Start() { IntegrationTest.Assert(true); IntegrationTest.Pass(); } } ================================================ FILE: Foundation.Unity/Assets/Tests/DemoTest.cs.meta ================================================ fileFormatVersion: 2 guid: cbb54cb807ef05046a70cbbbd60aecda timeCreated: 1473304596 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/DomainEventsTest.cs ================================================ using Foundation.Architecture; using UnityEngine; [IntegrationTest.DynamicTest("TestScene")] [IntegrationTest.Timeout(10)] public class DomainEventsTest : MonoBehaviour { public class Msg { public string Content { get; set; } } const string MagicString = "Hello World"; private int counter = 0; void Start() { TestMethod.RunAll(this, () => { counter = 0; }); } [TestMethod] public void TestSubscribe() { //Define a message class to send var msg = new Msg { Content = MagicString }; //subscribe you handlers DomainEvents.Subscribe(Handler); //maby ways to send DomainEvents.Publish(msg); DomainEvents.Publish(msg); DomainEvents.Publish(msg, typeof(Msg)); Assert.AreEqual(counter, 3); DomainEvents.Unsubscribe(Handler); DomainEvents.Publish(msg); Assert.AreEqual(counter, 3); } [TestMethod] public void TestAddEvent() { var msg = new Msg { Content = MagicString }; DomainEvents.OnMessage += Handler; DomainEvents.Publish(msg); DomainEvents.Publish(msg); DomainEvents.Publish(msg, typeof(Msg)); Assert.AreEqual(counter, 3); DomainEvents.Unsubscribe(Handler); DomainEvents.Publish(msg); Assert.AreEqual(counter, 3); } public void Handler(Msg myMessage) { Assert.AreEqual(myMessage.Content, MagicString); counter++; } } ================================================ FILE: Foundation.Unity/Assets/Tests/DomainEventsTest.cs.meta ================================================ fileFormatVersion: 2 guid: aa9b3b094f5459140b33538ca057ecce timeCreated: 1473309957 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/InjectorTests.cs ================================================ using System.Linq; using Foundation.Architecture; using UnityEngine; [IntegrationTest.Timeout(10)] [IntegrationTest.DynamicTest("TestScene")] public class InjectorTests : MonoBehaviour { #region models public interface IWordService { string GetWord(); } public interface ISentanceService { string GetSentance(); } public class WordService : IWordService { public string GetWord() { return "World"; } } public class SentanceService : ISentanceService { [Inject] public IWordService Words; public string GetSentance() { return "Hello "+Words.GetWord(); } } public class Document { [Inject] public ISentanceService Sentances; [Inject] public IWordService Words; public string Print() { return Sentances.GetSentance(); } } #endregion void Cleanup() { InjectService.UnregisterAll(); } void Start() { TestMethod.RunAll(this, Cleanup); IntegrationTest.Pass(); } [TestMethod] public void TestTransient() { //Register a concrete type keyed by an interface InjectService.RegisterTransient(); InjectService.RegisterTransient(); InjectService.RegisterTransient(); var document = InjectService.Get(); Assert.IsNotNull(document); Assert.IsNotNull(document.Sentances); Assert.IsNotNull(document.Words); Assert.AreEqual(document.Print(), document.Sentances.GetSentance()); } [TestMethod] public void TestTransient2() { //Not we are not using the interface here InjectService.RegisterTransient(); Assert.IsNotNull(InjectService.Get()); InjectService.RegisterTransient(() => new SentanceService()); Assert.IsNotNull(InjectService.Get()); } [TestMethod] public void TestSingleton() { InjectService.RegisterSingleton(); InjectService.RegisterSingleton(); InjectService.RegisterSingleton(); var document = InjectService.Get(); Assert.IsNotNull(document); Assert.IsNotNull(document.Sentances); Assert.IsNotNull(document.Words); Assert.AreEqual(document.Print(), document.Sentances.GetSentance()); var document2 = InjectService.Get(); Assert.AreEqual(document, document2); Assert.AreEqual(document.Words, document2.Words); Assert.AreEqual(document.Sentances, document2.Sentances); } [TestMethod] public void TestSingleton2() { // Note we are NOT using the interface here // Since we use a dictionary internally, these are keyed by the concrete type only. // We can make the InjectService more flexible, but, that would be a performance hit. InjectService.RegisterSingleton(); Assert.IsNotNull(InjectService.Get()); InjectService.RegisterSingleton(() => new SentanceService()); Assert.IsNotNull(InjectService.Get()); InjectService.RegisterSingleton(new Document()); Assert.IsNotNull(InjectService.Get()); InjectService.UnregisterAll(); InjectService.RegisterSingleton(new WordService()); Assert.IsNotNull(InjectService.Get()); InjectService.RegisterSingleton(() => new SentanceService()); Assert.IsNotNull(InjectService.Get()); } [TestMethod] public void TestRemove() { InjectService.RegisterTransient(); InjectService.RegisterTransient(); InjectService.RegisterTransient(); InjectService.Unregister(); var document = InjectService.Get(); Assert.IsNull(document); InjectService.UnregisterAll(); Assert.IsNull(InjectService.Get()); Assert.IsNull(InjectService.Get()); } [TestMethod] public void TestNull() { var document = InjectService.Get(); Assert.IsNull(document); } [TestMethod] public void TestPrint() { InjectService.RegisterSingleton(); InjectService.RegisterSingleton(); InjectService.RegisterSingleton(); var log = InjectService.Print(); Assert.IsTrue(log.Count() == 3); } } ================================================ FILE: Foundation.Unity/Assets/Tests/InjectorTests.cs.meta ================================================ fileFormatVersion: 2 guid: e8c7338b83c6e6b4da5ee163f6ef1148 timeCreated: 1473308413 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/ObjectEventsTest.cs ================================================ using System; using Foundation.Architecture; using UnityEngine; [IntegrationTest.DynamicTest("TestScene")] [IntegrationTest.Timeout(10)] public class ObjectEventsTest : MonoBehaviour { public class Msg { public string Content { get; set; } } public class SpaceShip { } public SpaceShip route = new SpaceShip(); public SpaceShip route2 = new SpaceShip(); const string MagicString = "Hello World"; private int counter = 0; void Start() { TestMethod.RunAll(this, () => { counter = 0; ObjectEvents.Clear(); ObjectEvents.Clear(); }); } [TestMethod] public void TestStringRoute() { counter = 0; var msg = new Msg {Content = MagicString}; var route = "Users/NVenti"; ObjectEvents.Subscribe(route, Handler); ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg, typeof(string), typeof(Msg)); Assert.AreEqual(counter, 3); //bad route ObjectEvents.Publish(route + route, msg, typeof(string), typeof(Msg)); ObjectEvents.Unsubscribe(route, Handler); ObjectEvents.Publish(route, msg); Assert.AreEqual(counter, 3); ObjectEvents.Subscribe(route, Handler); ObjectEvents.Unsubscribe(route); ObjectEvents.Publish(route, msg); Assert.AreEqual(counter, 3); } [TestMethod] public void TestObjectRoute() { counter = 0; //define out message, a class var msg = new Msg {Content = MagicString}; //subscribe using the object reference ObjectEvents.Subscribe(route, Handler); //many ways to send ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg, typeof(SpaceShip), typeof(Msg)); Assert.AreEqual(counter, 3); //bad route ObjectEvents.Publish(route2, msg, typeof(SpaceShip), typeof(Msg)); //be sure to clean up as we are not using weak references ObjectEvents.Unsubscribe(route, Handler); ObjectEvents.Publish(route, msg); Assert.AreEqual(counter, 3); ObjectEvents.Subscribe(route, Handler); ObjectEvents.Unsubscribe(route); ObjectEvents.Publish(route, msg); Assert.AreEqual(counter, 3); } public void Handler(Msg myMessage) { Assert.AreEqual(myMessage.Content, MagicString); counter++; } } ================================================ FILE: Foundation.Unity/Assets/Tests/ObjectEventsTest.cs.meta ================================================ fileFormatVersion: 2 guid: 470c3da55fc65b043a3618cce5e8915f timeCreated: 1473309957 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/ObservableTests.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Foundation.Architecture; using UnityEngine; [IntegrationTest.DynamicTest("TestScene")] [IntegrationTest.Timeout(10)] public class ObservableTests : MonoBehaviour { public class ViewModel : ObservableObject { private string _myProperty2; public string MyProperty2 { get { return _myProperty2; } set { if (_myProperty2 == value) return; _myProperty2 = value; RaiseChange("MyProperty2", value); } } private int _myProperty; public int MyProperty { get { return _myProperty; } set { if (_myProperty == value) return; _myProperty = value; RaiseChange("MyProperty", value); } } public void MyCommand() { MyProperty++; } public void MyCommand2(int value) { MyProperty = (value + _myProperty); } } void Start() { TestMethod.RunAll(this, () => { }); } [TestMethod] public void TestObservableObject() { var vm = new ViewModel(); int counter = 0; vm.OnPublish += (name) => { Assert.AreEqual(name.Name, "MyProperty"); Assert.AreEqual(name.Sender, vm); counter++; }; vm.MyCommand(); Assert.AreEqual(vm.MyProperty, 1); vm.MyCommand2(2); Assert.AreEqual(vm.MyProperty, 3); vm.MyProperty = 0; Assert.AreEqual(vm.MyProperty, 0); Assert.AreEqual(counter, 3); } [TestMethod] public void TestObservableProxy() { var vm = new ViewModel(); var proxy = new ObservableProxy(vm); int counter2 = 0; int counter1 = 0; vm.OnPublish += (e) => { counter1++; }; proxy.OnPublish += (e) => { counter2++; }; proxy.Post("MyCommand"); Assert.AreEqual(vm.MyProperty, 1); proxy.Post("MyCommand2", 2); Assert.AreEqual(vm.MyProperty, 3); proxy.Post("MyProperty", 0); Assert.AreEqual(vm.MyProperty, 0); Assert.AreEqual(counter1, 3); Assert.AreEqual(counter2, 3); proxy.Dispose(); } [TestMethod] public void TestConversion() { var vm = new ViewModel(); var proxy = new ObservableProxy(vm); int counter2 = 0; int counter1 = 0; vm.OnPublish += (e) => { counter1++; }; proxy.OnPublish += (e) => { counter2++; }; proxy.Post("MyCommand"); Assert.AreEqual(vm.MyProperty, 1); proxy.Post("MyCommand2", "2"); Assert.AreEqual(vm.MyProperty, 3); proxy.Post("MyProperty", 0f); Assert.AreEqual(vm.MyProperty, 0); Assert.AreEqual(counter1, 3); Assert.AreEqual(counter2, 3); proxy.Post("MyProperty2", "1"); var temp = proxy.Get("MyProperty2"); Assert.AreEqual(temp, 1); proxy.Dispose(); } [TestMethod] public void TestObservable() { var vm = new ObservableProperty(); vm.Value = 10; int counter = 0; vm.OnPublish += (v) => { if (counter == 0) Assert.AreEqual(10, v); counter++; }; vm.Value = 0; vm.Value++; Assert.AreEqual(vm.Value, 1); vm.Value--; Assert.AreEqual(vm.Value, 0); vm.Value++; Assert.AreEqual(vm.Value, 1); Assert.AreEqual(counter, 5); } [TestMethod] public void TestList() { var vm = new ObservableList(); var v = new List(); Action test = () => { Assert.IsTrue(v.Count == vm.Count); for (int i = 0; i < v.Count; i++) { Assert.IsTrue(v[i] == vm[i]); } }; vm.OnPublish += (args) => { switch (args.Event) { case ListChangedEventType.Add: { foreach (var item in args.Items) { v.Add(item as string); } } break; case ListChangedEventType.Remove: { foreach (var item in args.Items) { v.Remove(item as string); } } break; case ListChangedEventType.Replace: { var index = v.IndexOf(args.Items.ElementAt(0) as string); if (index >= 0) { v[index] = args.Items.ElementAt(0) as string; } } break; case ListChangedEventType.Insert: { for (int j = 0; j < args.Items.Count(); j++) { v.Insert(j + args.Index, args.Items.ElementAt(j) as string); } } break; case ListChangedEventType.Clear: { v.Clear(); } break; case ListChangedEventType.Refresh: { //Nothing, flicker UI } break; } test(); }; vm.Add("0"); for (int i = 1; i < 100; i++) { vm.Add(i.ToString()); } for (int i = 1; i < 10; i++) { vm.Remove((i + 10).ToString()); } vm.AddRange(new[] { "11", "12", "13" }); vm.RemoveRange(new[] { "11", "12", "13" }); vm.Replace("99"); vm.Insert(3, "199"); var h = vm.IndexOf("21"); vm[h] = "21"; vm.Clear(); } [TestMethod] public void TestObservableMetrics() { var vm = new ViewModel(); var proxy = new ObservableProxy(vm); var watch = new Stopwatch(); long testNormal = long.MinValue; long testReflected = long.MinValue; long testProxy = long.MinValue; long testInvoke = long.MinValue; var invoke = (Action)Delegate.CreateDelegate(typeof(Action), vm, "MyCommand"); //Dry run first before real test for (int k = 0; k < 5; k++) { watch.Reset(); watch.Start(); for (int i = 0; i < 1000; i++) { vm.MyCommand(); } watch.Stop(); testNormal = watch.ElapsedTicks; watch.Reset(); watch.Start(); for (int i = 0; i < 1000; i++) { proxy.Post("MyCommand"); } watch.Stop(); testProxy = watch.ElapsedTicks; watch.Reset(); watch.Start(); for (int i = 0; i < 1000; i++) { invoke(); } watch.Stop(); testInvoke = watch.ElapsedTicks; watch.Reset(); watch.Start(); for (int i = 0; i < 1000; i++) { vm.GetType().GetMethod("MyCommand").Invoke(vm, null); } watch.Stop(); testReflected = watch.ElapsedTicks; } //Normal = 81 //Reflected = 1088 //Cached = 82 //Proxy = 507 UnityEngine.Debug.Log("Normal = " + testNormal); UnityEngine.Debug.Log("Reflected = " + testReflected); UnityEngine.Debug.Log("Cached = " + testInvoke); UnityEngine.Debug.Log("Proxy = " + testProxy); } } ================================================ FILE: Foundation.Unity/Assets/Tests/ObservableTests.cs.meta ================================================ fileFormatVersion: 2 guid: a0b8095b555d3aa4a88302ff66af4885 timeCreated: 1473309957 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/TestMethod.cs ================================================ using System; using System.Collections; using System.Linq; using System.Reflection; using UnityEngine; /// /// DOTNET Shim /// public class TestMethod : Attribute { public static void RunAll(MonoBehaviour testClass, Action cleanup) { testClass.StartCoroutine(RunAllAsync(testClass, cleanup)); } public static IEnumerator RunAllAsync(MonoBehaviour testClass, Action cleanup) { var calls = testClass.GetType().GetMethods() .Where( o => o.GetCustomAttributes(typeof(TestMethod), false) .Any(a => a.GetType() == typeof(TestMethod))) .ToArray(); var name = testClass.GetType().Name; Debug.Log(name + ".Start"); foreach (var call in calls) { Debug.Log(name + ".Cleanup"); cleanup(); Debug.Log(name + "." + call.Name); if (call.ReturnType == typeof(IEnumerator)) { yield return testClass.StartCoroutine(call.Name); } else { try { call.Invoke(testClass, null); } catch (Exception ex) { Debug.LogError("ERROR " + call.Name + " " + ex.Message); UnityEngine.Debug.LogException(ex); yield break; } } } cleanup(); Debug.Log(name + ".End"); IntegrationTest.Pass(testClass.gameObject); } } ================================================ FILE: Foundation.Unity/Assets/Tests/TestMethod.cs.meta ================================================ fileFormatVersion: 2 guid: c2f222b33a8dd8045955ab79f5094e84 timeCreated: 1473308412 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/TestScene.unity.meta ================================================ fileFormatVersion: 2 guid: 4ca74bd6b8955724693eb9f9fd457961 timeCreated: 1473304364 licenseType: Free DefaultImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests/ThreadingTests.cs ================================================ using System.Collections; using Foundation.Architecture; using UnityEngine; [IntegrationTest.DynamicTest("TestScene")] [IntegrationTest.Timeout(10)] public class ThreadingTests : MonoBehaviour { private double updateCounter; public void Start() { TestMethod.RunAll(this, () => updateCounter = 0); } [TestMethod] public IEnumerator TestUpdate() { var task = ThreadingService.RunUpdate(MyUpdate); yield return 1; yield return new WaitForSeconds(1.2f); //Asset works Assert.IsTrue(updateCounter >= 1); task.Dispose(); var old = updateCounter; yield return new WaitForSeconds(1); //Asset Dispose works Assert.IsTrue(updateCounter == old); } void MyUpdate(double delta) { updateCounter += delta; } [TestMethod] public IEnumerator TestDelay() { var task = ThreadingService.RunDelay(UpdateDelay, 1); yield return new WaitForSeconds(.5f); //Asset Not early executed Assert.IsTrue(updateCounter == 0); yield return new WaitForSeconds(2f); //Asset Executed in time Assert.IsTrue(updateCounter >= 1); task.Dispose(); updateCounter = 0; task = ThreadingService.RunDelay(UpdateDelay, 1); yield return new WaitForSeconds(.5f); task.Dispose(); yield return new WaitForSeconds(1.5f); //asset early dispose Assert.IsTrue(updateCounter == 0); } void UpdateDelay() { updateCounter++; } [TestMethod] public IEnumerator TestCoroutine() { updateCounter = 0; ThreadingService.RunRoutine(CoroutineAsync()); yield return new WaitForSeconds(1); Assert.IsTrue(updateCounter == 5); } IEnumerator CoroutineAsync() { updateCounter++; yield return 1; updateCounter++; yield return 1; updateCounter++; yield return 1; updateCounter++; yield return 1; updateCounter++; yield return 1; } } ================================================ FILE: Foundation.Unity/Assets/Tests/ThreadingTests.cs.meta ================================================ fileFormatVersion: 2 guid: d6a460540a452e743882591984cdc4b8 timeCreated: 1473309957 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/Tests.meta ================================================ fileFormatVersion: 2 guid: 9cab23d9dbd89d74591ce858c1a129e3 folderAsset: yes timeCreated: 1473304557 licenseType: Free DefaultImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Assertions.meta ================================================ fileFormatVersion: 2 guid: b27b28700d3365146808b6e082748201 folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/Icons.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; namespace UnityTest { public static class Icons { const string k_IconsFolderName = "icons"; private static readonly string k_IconsFolderPath = String.Format("UnityTestTools{0}Common{0}Editor{0}{1}", Path.DirectorySeparatorChar, k_IconsFolderName); private static readonly string k_IconsAssetsPath = ""; public static readonly Texture2D FailImg; public static readonly Texture2D IgnoreImg; public static readonly Texture2D SuccessImg; public static readonly Texture2D UnknownImg; public static readonly Texture2D InconclusiveImg; public static readonly Texture2D StopwatchImg; public static readonly GUIContent GUIUnknownImg; public static readonly GUIContent GUIInconclusiveImg; public static readonly GUIContent GUIIgnoreImg; public static readonly GUIContent GUISuccessImg; public static readonly GUIContent GUIFailImg; static Icons() { var dirs = Directory.GetDirectories("Assets", k_IconsFolderName, SearchOption.AllDirectories).Where(s => s.EndsWith(k_IconsFolderPath)); if (dirs.Any()) k_IconsAssetsPath = dirs.First(); else Debug.LogWarning("The UnityTestTools asset folder path is incorrect. If you relocated the tools please change the path accordingly (Icons.cs)."); FailImg = LoadTexture("failed.png"); IgnoreImg = LoadTexture("ignored.png"); SuccessImg = LoadTexture("passed.png"); UnknownImg = LoadTexture("normal.png"); InconclusiveImg = LoadTexture("inconclusive.png"); StopwatchImg = LoadTexture("stopwatch.png"); GUIUnknownImg = new GUIContent(UnknownImg); GUIInconclusiveImg = new GUIContent(InconclusiveImg); GUIIgnoreImg = new GUIContent(IgnoreImg); GUISuccessImg = new GUIContent(SuccessImg); GUIFailImg = new GUIContent(FailImg); } private static Texture2D LoadTexture(string fileName) { return (Texture2D)AssetDatabase.LoadAssetAtPath(k_IconsAssetsPath + Path.DirectorySeparatorChar + fileName, typeof(Texture2D)); } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/Icons.cs.meta ================================================ fileFormatVersion: 2 guid: 8571844b0c115b84cbe8b3f67e8dec04 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/ProjectSettingsBase.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; namespace UnityTest { public abstract class ProjectSettingsBase : ScriptableObject { private static readonly string k_SettingsPath = Path.Combine("UnityTestTools", "Common"); const string k_SettingsFolder = "Settings"; public virtual void Save() { EditorUtility.SetDirty(this); } public static T Load() where T : ProjectSettingsBase, new () { var pathsInProject = Directory.GetDirectories("Assets", "*", SearchOption.AllDirectories) .Where(s => s.Contains(k_SettingsPath)); if (pathsInProject.Count() == 0) Debug.LogError("Can't find settings path: " + k_SettingsPath); string pathInProject = Path.Combine(pathsInProject.First(), k_SettingsFolder); var assetPath = Path.Combine(pathInProject, typeof(T).Name) + ".asset"; var settings = AssetDatabase.LoadAssetAtPath(assetPath, typeof(T)) as T; if (settings != null) return settings; settings = CreateInstance(); Directory.CreateDirectory(pathInProject); AssetDatabase.CreateAsset(settings, assetPath); return settings; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/ProjectSettingsBase.cs.meta ================================================ fileFormatVersion: 2 guid: 9ac961be07107124a88dcb81927143d4 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/ResultWriter/ResultSummarizer.cs ================================================ // **************************************************************** // Based on nUnit 2.6.2 (http://www.nunit.org/) // **************************************************************** using System; using System.Collections.Generic; using UnityEngine; namespace UnityTest { /// /// Summary description for ResultSummarizer. /// public class ResultSummarizer { private int m_ErrorCount; private int m_FailureCount; private int m_IgnoreCount; private int m_InconclusiveCount; private int m_NotRunnable; private int m_ResultCount; private int m_SkipCount; private int m_SuccessCount; private int m_TestsRun; private TimeSpan m_Duration; 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(ITestResult result) { m_Duration += TimeSpan.FromSeconds(result.Duration); m_ResultCount++; if(!result.Executed) { if(result.IsIgnored) { m_IgnoreCount++; return; } m_SkipCount++; return; } switch (result.ResultState) { case TestResultState.Success: m_SuccessCount++; m_TestsRun++; break; case TestResultState.Failure: m_FailureCount++; m_TestsRun++; break; 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; } } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/ResultWriter/ResultSummarizer.cs.meta ================================================ fileFormatVersion: 2 guid: ce89106be5bd4204388d58510e4e55da MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/ResultWriter/StackTraceFilter.cs ================================================ // **************************************************************** // Based on nUnit 2.6.2 (http://www.nunit.org/) // **************************************************************** using System; using System.Collections.Generic; using System.IO; using UnityEngine; namespace UnityTest { /// /// Summary description for StackTraceFilter. /// public class StackTraceFilter { public static string Filter(string stack) { if (stack == null) return null; var sw = new StringWriter(); var sr = new StringReader(stack); try { string line; while ((line = sr.ReadLine()) != null) { if (!FilterLine(line)) sw.WriteLine(line.Trim()); } } catch (Exception) { return stack; } return sw.ToString(); } static bool FilterLine(string line) { string[] patterns = { "NUnit.Core.TestCase", "NUnit.Core.ExpectedExceptionTestCase", "NUnit.Core.TemplateTestCase", "NUnit.Core.TestResult", "NUnit.Core.TestSuite", "NUnit.Framework.Assertion", "NUnit.Framework.Assert", "System.Reflection.MonoMethod" }; for (int i = 0; i < patterns.Length; i++) { if (line.IndexOf(patterns[i]) > 0) return true; } return false; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/ResultWriter/StackTraceFilter.cs.meta ================================================ fileFormatVersion: 2 guid: fe6b4d68575d4ba44b1d5c5c3f0e96d3 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/ResultWriter/XmlResultWriter.cs ================================================ using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Security; using System.Text; using UnityEngine; namespace UnityTest { public class XmlResultWriter { private readonly StringBuilder m_ResultWriter = new StringBuilder(); private int m_Indend; private readonly string m_SuiteName; private readonly ITestResult[] m_Results; string m_Platform; public XmlResultWriter(string suiteName, string platform, ITestResult[] results) { m_SuiteName = suiteName; m_Results = results; m_Platform = platform; } private const string k_NUnitVersion = "2.6.2-Unity"; public string GetTestResult() { InitializeXmlFile(m_SuiteName, new ResultSummarizer(m_Results)); foreach (var result in m_Results) { WriteResultElement(result); } TerminateXmlFile(); return m_ResultWriter.ToString(); } private void InitializeXmlFile(string resultsName, ResultSummarizer summaryResults) { WriteHeader(); DateTime now = DateTime.Now; var attributes = new Dictionary { {"name", "Unity Tests"}, {"total", summaryResults.TestsRun.ToString()}, {"errors", summaryResults.Errors.ToString()}, {"failures", summaryResults.Failures.ToString()}, {"not-run", summaryResults.TestsNotRun.ToString()}, {"inconclusive", summaryResults.Inconclusive.ToString()}, {"ignored", summaryResults.Ignored.ToString()}, {"skipped", summaryResults.Skipped.ToString()}, {"invalid", summaryResults.NotRunnable.ToString()}, {"date", now.ToString("yyyy-MM-dd")}, {"time", now.ToString("HH:mm:ss")} }; WriteOpeningElement("test-results", attributes); WriteEnvironment(m_Platform); WriteCultureInfo(); WriteTestSuite(resultsName, summaryResults); WriteOpeningElement("results"); } private void WriteOpeningElement(string elementName) { WriteOpeningElement(elementName, new Dictionary()); } private void WriteOpeningElement(string elementName, Dictionary attributes) { WriteOpeningElement(elementName, attributes, false); } private void WriteOpeningElement(string elementName, Dictionary attributes, bool closeImmediatelly) { WriteIndend(); m_Indend++; m_ResultWriter.Append("<"); m_ResultWriter.Append(elementName); foreach (var attribute in attributes) { m_ResultWriter.AppendFormat(" {0}=\"{1}\"", attribute.Key, SecurityElement.Escape(attribute.Value)); } if (closeImmediatelly) { m_ResultWriter.Append(" /"); m_Indend--; } m_ResultWriter.AppendLine(">"); } private void WriteIndend() { for (int i = 0; i < m_Indend; i++) { m_ResultWriter.Append(" "); } } private void WriteClosingElement(string elementName) { m_Indend--; WriteIndend(); m_ResultWriter.AppendLine(""); } private void WriteHeader() { m_ResultWriter.AppendLine(""); m_ResultWriter.AppendLine(""); } static string GetEnvironmentUserName() { return Environment.UserName; } static string GetEnvironmentMachineName() { return Environment.MachineName; } static string GetEnvironmentUserDomainName() { return Environment.UserDomainName; } static string GetEnvironmentVersion() { return Environment.Version.ToString(); } static string GetEnvironmentOSVersion() { return Environment.OSVersion.ToString(); } static string GetEnvironmentOSVersionPlatform() { return Environment.OSVersion.Platform.ToString(); } static string EnvironmentGetCurrentDirectory() { return Environment.CurrentDirectory; } private void WriteEnvironment( string targetPlatform ) { var attributes = new Dictionary { {"nunit-version", k_NUnitVersion}, {"clr-version", GetEnvironmentVersion()}, {"os-version", GetEnvironmentOSVersion()}, {"platform", GetEnvironmentOSVersionPlatform()}, {"cwd", EnvironmentGetCurrentDirectory()}, {"machine-name", GetEnvironmentMachineName()}, {"user", GetEnvironmentUserName()}, {"user-domain", GetEnvironmentUserDomainName()}, {"unity-version", Application.unityVersion}, {"unity-platform", targetPlatform} }; WriteOpeningElement("environment", attributes, true); } private void WriteCultureInfo() { var attributes = new Dictionary { {"current-culture", CultureInfo.CurrentCulture.ToString()}, {"current-uiculture", CultureInfo.CurrentUICulture.ToString()} }; WriteOpeningElement("culture-info", attributes, true); } private void WriteTestSuite(string resultsName, ResultSummarizer summaryResults) { var attributes = new Dictionary { {"name", resultsName}, {"type", "Assembly"}, {"executed", "True"}, {"result", summaryResults.Success ? "Success" : "Failure"}, {"success", summaryResults.Success ? "True" : "False"}, {"time", summaryResults.Duration.ToString("#####0.000", NumberFormatInfo.InvariantInfo)} }; WriteOpeningElement("test-suite", attributes); } private void WriteResultElement(ITestResult result) { StartTestElement(result); switch (result.ResultState) { case TestResultState.Ignored: case TestResultState.NotRunnable: case TestResultState.Skipped: WriteReasonElement(result); break; case TestResultState.Failure: case TestResultState.Error: case TestResultState.Cancelled: WriteFailureElement(result); break; case TestResultState.Success: case TestResultState.Inconclusive: if (result.Message != null) WriteReasonElement(result); break; }; WriteClosingElement("test-case"); } private void TerminateXmlFile() { WriteClosingElement("results"); WriteClosingElement("test-suite"); WriteClosingElement("test-results"); } #region Element Creation Helpers private void StartTestElement(ITestResult result) { var attributes = new Dictionary { {"name", result.FullName}, {"executed", result.Executed.ToString()} }; string resultString; switch (result.ResultState) { case TestResultState.Cancelled: resultString = TestResultState.Failure.ToString(); break; default: resultString = result.ResultState.ToString(); break; } attributes.Add("result", resultString); if (result.Executed) { attributes.Add("success", result.IsSuccess.ToString()); attributes.Add("time", result.Duration.ToString("#####0.000", NumberFormatInfo.InvariantInfo)); } WriteOpeningElement("test-case", attributes); } private void WriteReasonElement(ITestResult result) { WriteOpeningElement("reason"); WriteOpeningElement("message"); WriteCData(result.Message); WriteClosingElement("message"); WriteClosingElement("reason"); } private void WriteFailureElement(ITestResult result) { WriteOpeningElement("failure"); WriteOpeningElement("message"); WriteCData(result.Message); WriteClosingElement("message"); WriteOpeningElement("stack-trace"); if (result.StackTrace != null) WriteCData(StackTraceFilter.Filter(result.StackTrace)); WriteClosingElement("stack-trace"); WriteClosingElement("failure"); } #endregion private void WriteCData(string text) { if (string.IsNullOrEmpty(text)) return; m_ResultWriter.AppendFormat("", text); m_ResultWriter.AppendLine(); } public void WriteToFile(string resultDestiantion, string resultFileName) { try { var path = Path.Combine(resultDestiantion, resultFileName); Debug.Log("Saving results in " + path); File.WriteAllText(path, GetTestResult(), Encoding.UTF8); } catch (Exception e) { Debug.LogError("Error while opening file"); Debug.LogException(e); } } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/ResultWriter/XmlResultWriter.cs.meta ================================================ fileFormatVersion: 2 guid: e9bba41ace7686d4ab0c400d1e7f55b7 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/ResultWriter.meta ================================================ fileFormatVersion: 2 guid: 4ffbf5a07740aa5479651bd415f52ebb folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/Styles.cs ================================================ using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace UnityTest { public static class Styles { public static GUIStyle info; public static GUIStyle testList; public static GUIStyle selectedFoldout; public static GUIStyle foldout; public static GUIStyle toolbarLabel; public static GUIStyle testName; private static readonly Color k_SelectedColor = new Color(0.3f, 0.5f, 0.85f); 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; foldout = new GUIStyle(EditorStyles.foldout); selectedFoldout = new GUIStyle(EditorStyles.foldout); selectedFoldout.onFocused.textColor = selectedFoldout.focused.textColor = selectedFoldout.onActive.textColor = selectedFoldout.active.textColor = selectedFoldout.onNormal.textColor = selectedFoldout.normal.textColor = k_SelectedColor; toolbarLabel = new GUIStyle(EditorStyles.toolbarButton); toolbarLabel.normal.background = null; toolbarLabel.contentOffset = new Vector2(0, -2); testName = new GUIStyle(EditorStyles.label); testName.padding.left += 12; testName.focused.textColor = testName.onFocused.textColor = k_SelectedColor; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/Styles.cs.meta ================================================ fileFormatVersion: 2 guid: a8b92379e11501742b1badcbb08da812 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/TestFilterSettings.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.Linq; namespace UnityTest { public class TestFilterSettings { public bool ShowSucceeded; public bool ShowFailed; public bool ShowIgnored; public bool ShowNotRun; public string FilterByName; public int FilterByCategory; private GUIContent _succeededBtn; private GUIContent _failedBtn; private GUIContent _ignoredBtn; private GUIContent _notRunBtn; public string[] AvailableCategories; private readonly string _prefsKey; public TestFilterSettings(string prefsKey) { _prefsKey = prefsKey; Load(); UpdateCounters(Enumerable.Empty()); } public void Load() { ShowSucceeded = EditorPrefs.GetBool(_prefsKey + ".ShowSucceeded", true); ShowFailed = EditorPrefs.GetBool(_prefsKey + ".ShowFailed", true); ShowIgnored = EditorPrefs.GetBool(_prefsKey + ".ShowIgnored", true); ShowNotRun = EditorPrefs.GetBool(_prefsKey + ".ShowNotRun", true); FilterByName = EditorPrefs.GetString(_prefsKey + ".FilterByName", string.Empty); FilterByCategory = EditorPrefs.GetInt(_prefsKey + ".FilterByCategory", 0); } public void Save() { EditorPrefs.SetBool(_prefsKey + ".ShowSucceeded", ShowSucceeded); EditorPrefs.SetBool(_prefsKey + ".ShowFailed", ShowFailed); EditorPrefs.SetBool(_prefsKey + ".ShowIgnored", ShowIgnored); EditorPrefs.SetBool(_prefsKey + ".ShowNotRun", ShowNotRun); EditorPrefs.SetString(_prefsKey + ".FilterByName", FilterByName); EditorPrefs.SetInt(_prefsKey + ".FilterByCategory", FilterByCategory); } public void UpdateCounters(IEnumerable results) { var summary = new ResultSummarizer(results); _succeededBtn = new GUIContent(summary.Passed.ToString(), Icons.SuccessImg, "Show tests that succeeded"); _failedBtn = new GUIContent((summary.Errors + summary.Failures + summary.Inconclusive).ToString(), Icons.FailImg, "Show tests that failed"); _ignoredBtn = new GUIContent((summary.Ignored + summary.NotRunnable).ToString(), Icons.IgnoreImg, "Show tests that are ignored"); _notRunBtn = new GUIContent((summary.TestsNotRun - summary.Ignored - summary.NotRunnable).ToString(), Icons.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, _succeededBtn, EditorStyles.toolbarButton); ShowFailed = GUILayout.Toggle(ShowFailed, _failedBtn, EditorStyles.toolbarButton); ShowIgnored = GUILayout.Toggle(ShowIgnored, _ignoredBtn, EditorStyles.toolbarButton); ShowNotRun = GUILayout.Toggle(ShowNotRun, _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; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/TestFilterSettings.cs.meta ================================================ fileFormatVersion: 2 guid: 5a2d025e58bff433e963d0a4cd7599ef MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/icons/failed.png.meta ================================================ fileFormatVersion: 2 guid: 41488feb372865440b7c01773f04c0cf TextureImporter: 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 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 1024 textureSettings: filterMode: -1 aniso: 1 mipBias: -1 wrapMode: 1 nPOTScale: 0 lightmap: 0 compressionQuality: 50 textureType: 2 buildTargetSettings: [] userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/icons/ignored.png.meta ================================================ fileFormatVersion: 2 guid: 0076bfa6073f17546b3535ac1b456b0b TextureImporter: 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 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 1024 textureSettings: filterMode: -1 aniso: 1 mipBias: -1 wrapMode: 1 nPOTScale: 0 lightmap: 0 compressionQuality: 50 textureType: 2 buildTargetSettings: [] userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/icons/inconclusive.png.meta ================================================ fileFormatVersion: 2 guid: e28761099904678488cdddf7b6be2ceb TextureImporter: 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 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 1024 textureSettings: filterMode: -1 aniso: 1 mipBias: -1 wrapMode: 1 nPOTScale: 0 lightmap: 0 compressionQuality: 50 textureType: 2 buildTargetSettings: [] userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/icons/normal.png.meta ================================================ fileFormatVersion: 2 guid: a9f3c491f4c2f9f43ac33a27c16913dd TextureImporter: 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 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 1024 textureSettings: filterMode: -1 aniso: 1 mipBias: -1 wrapMode: 1 nPOTScale: 0 lightmap: 0 compressionQuality: 50 textureType: 2 buildTargetSettings: [] userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/icons/passed.png.meta ================================================ fileFormatVersion: 2 guid: 31f7928179ee46d4690d274579efb037 TextureImporter: 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 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 1024 textureSettings: filterMode: -1 aniso: 1 mipBias: -1 wrapMode: 1 nPOTScale: 0 lightmap: 0 compressionQuality: 50 textureType: 2 buildTargetSettings: [] userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/icons/stopwatch.png.meta ================================================ fileFormatVersion: 2 guid: f73f95ae19d51af47ad56044f2779aa1 TextureImporter: 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 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 1024 textureSettings: filterMode: -1 aniso: 1 mipBias: -1 wrapMode: 1 nPOTScale: 0 lightmap: 0 compressionQuality: 50 textureType: 2 buildTargetSettings: [] userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor/icons.meta ================================================ fileFormatVersion: 2 guid: e8bb6eae11352f44da0d6d8a8959b69e DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Editor.meta ================================================ fileFormatVersion: 2 guid: f4ab061d0035ee545a936bdf8f3f8620 DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/ITestResult.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; using UnityTest; public interface ITestResult { TestResultState ResultState { get; } string Message { get; } string Logs { get; } bool Executed { get; } string Name { get; } string FullName { get; } string Id { get; } bool IsSuccess { get; } double Duration { get; } string StackTrace { get; } bool IsIgnored { get; } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/ITestResult.cs.meta ================================================ fileFormatVersion: 2 guid: d1e4e2c4d00b3f2469494fc0f67cdeae MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Settings/IntegrationTestsRunnerSettings.asset.meta ================================================ fileFormatVersion: 2 guid: 850c92faffd0f184bbed434fcc031693 timeCreated: 1473388709 licenseType: Free NativeFormatImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/Settings.meta ================================================ fileFormatVersion: 2 guid: 4f7ed47b0666ece469fcd2999dbd701b folderAsset: yes timeCreated: 1473353482 licenseType: Free DefaultImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/TestResultState.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; namespace UnityTest { public enum TestResultState : byte { Inconclusive = 0, /// /// The test was not runnable. /// NotRunnable = 1, /// /// The test has been skipped. /// Skipped = 2, /// /// The test has been ignored. /// Ignored = 3, /// /// The test succeeded /// Success = 4, /// /// The test failed /// Failure = 5, /// /// The test encountered an unexpected exception /// Error = 6, /// /// The test was cancelled by the user /// Cancelled = 7 } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common/TestResultState.cs.meta ================================================ fileFormatVersion: 2 guid: da3ca54ee4cce064989d27165f3081fb MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Common.meta ================================================ fileFormatVersion: 2 guid: a2caba6436df568499c84c1c607ce766 folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Documentation.url ================================================ [InternetShortcut] URL=https://bitbucket.org/Unity-Technologies/unitytesttools/wiki IconIndex=0 ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/Documentation.url.meta ================================================ fileFormatVersion: 2 guid: 28f1b62e1364e5a4e88f7bb94dbcf183 DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/Libs/Mono.Cecil.Mdb.dll.meta ================================================ fileFormatVersion: 2 guid: 713231d47408a06408a45470c967bae8 timeCreated: 1441797177 licenseType: Store PluginImporter: serializedVersion: 1 iconMap: {} executionOrder: {} isPreloaded: 0 platformData: Any: enabled: 0 settings: {} Editor: enabled: 1 settings: DefaultValueInitialized: true userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/Libs/Mono.Cecil.dll.meta ================================================ fileFormatVersion: 2 guid: 28fc22990733f8f4ea1137f15e363609 timeCreated: 1441797177 licenseType: Store PluginImporter: serializedVersion: 1 iconMap: {} executionOrder: {} isPreloaded: 0 platformData: Any: enabled: 0 settings: {} Editor: enabled: 1 settings: DefaultValueInitialized: true userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/Libs.meta ================================================ fileFormatVersion: 2 guid: e22ba039de7077c4aa95758ef723b803 folderAsset: yes timeCreated: 1445282049 licenseType: Store DefaultImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/DTOFormatter.cs ================================================ using System; using System.IO; using System.Runtime.Serialization; using System.Text; using UnityEngine; namespace UnityTest { public class DTOFormatter { private interface ITransferInterface { void Transfer(ref ResultDTO.MessageType val); void Transfer(ref TestResultState val); void Transfer(ref byte val); void Transfer(ref bool val); void Transfer(ref int val); void Transfer(ref float val); void Transfer(ref double val); void Transfer(ref string val); } private class Writer : ITransferInterface { private readonly Stream _stream; public Writer(Stream stream) { _stream = stream; } private void WriteConvertedNumber(byte[] bytes) { if(BitConverter.IsLittleEndian) Array.Reverse(bytes); _stream.Write(bytes, 0, bytes.Length); } public void Transfer(ref ResultDTO.MessageType val) { _stream.WriteByte((byte)val); } public void Transfer(ref TestResultState val) { _stream.WriteByte((byte)val); } public void Transfer(ref byte val) { _stream.WriteByte(val); } public void Transfer(ref bool val) { _stream.WriteByte((byte)(val ? 0x01 : 0x00)); } public void Transfer(ref int val) { WriteConvertedNumber(BitConverter.GetBytes(val)); } public void Transfer(ref float val) { WriteConvertedNumber(BitConverter.GetBytes(val)); } public void Transfer(ref double val) { WriteConvertedNumber(BitConverter.GetBytes(val)); } public void Transfer(ref string val) { var bytes = Encoding.BigEndianUnicode.GetBytes(val); int length = bytes.Length; Transfer(ref length); _stream.Write(bytes, 0, bytes.Length); } } private class Reader : ITransferInterface { private readonly Stream _stream; public Reader(Stream stream) { _stream = stream; } private byte[] ReadConvertedNumber(int size) { byte[] buffer = new byte[size]; _stream.Read (buffer, 0, buffer.Length); if(BitConverter.IsLittleEndian) Array.Reverse(buffer); return buffer; } public void Transfer(ref ResultDTO.MessageType val) { val = (ResultDTO.MessageType)_stream.ReadByte(); } public void Transfer(ref TestResultState val) { val = (TestResultState)_stream.ReadByte(); } public void Transfer(ref byte val) { val = (byte)_stream.ReadByte(); } public void Transfer(ref bool val) { val = (_stream.ReadByte() != 0); } public void Transfer(ref int val) { val = BitConverter.ToInt32(ReadConvertedNumber(4), 0); } public void Transfer(ref float val) { val = BitConverter.ToSingle(ReadConvertedNumber(4), 0); } public void Transfer(ref double val) { val = BitConverter.ToDouble(ReadConvertedNumber(8), 0); } public void Transfer(ref string val) { int length = 0; Transfer (ref length); var bytes = new byte[length]; int remain = length; int index = 0; do { int bytesRead = _stream.Read(bytes, index, remain); remain -= bytesRead; index += bytesRead; } while (remain > 0); #if !UNITY_WSA val = Encoding.BigEndianUnicode.GetString(bytes); #endif } } private void Transfer(ResultDTO dto, ITransferInterface transfer) { transfer.Transfer(ref dto.messageType); transfer.Transfer(ref dto.levelCount); transfer.Transfer(ref dto.loadedLevel); transfer.Transfer(ref dto.loadedLevelName); if(dto.messageType == ResultDTO.MessageType.Ping || dto.messageType == ResultDTO.MessageType.RunStarted || dto.messageType == ResultDTO.MessageType.RunFinished || dto.messageType == ResultDTO.MessageType.RunInterrupted || dto.messageType == ResultDTO.MessageType.AllScenesFinished) return; transfer.Transfer(ref dto.testName); transfer.Transfer(ref dto.testTimeout); if(dto.messageType == ResultDTO.MessageType.TestStarted) return; if(transfer is Reader) dto.testResult = new SerializableTestResult(); SerializableTestResult str = (SerializableTestResult)dto.testResult; transfer.Transfer(ref str.resultState); transfer.Transfer(ref str.message); transfer.Transfer(ref str.executed); transfer.Transfer(ref str.name); transfer.Transfer(ref str.fullName); transfer.Transfer(ref str.id); transfer.Transfer(ref str.isSuccess); transfer.Transfer(ref str.duration); transfer.Transfer(ref str.stackTrace); } public void Serialize (Stream stream, ResultDTO dto) { Transfer(dto, new Writer(stream)); } public object Deserialize (Stream stream) { #if !UNITY_WSA var result = (ResultDTO)FormatterServices.GetSafeUninitializedObject(typeof(ResultDTO)); Transfer (result, new Reader(stream)); return result; #else return null; #endif } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/DTOFormatter.cs.meta ================================================ fileFormatVersion: 2 guid: 7ae2470508a854b1c9df5375d03f8f58 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Batch.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEditorInternal; using UnityEngine; using UnityTest.IntegrationTests; using UnityEditor.SceneManagement; namespace UnityTest { public static partial class Batch { const string k_ResultFilePathParam = "-resultFilePath="; private const string k_TestScenesParam = "-testscenes="; private const string k_OtherBuildScenesParam = "-includeBuildScenes="; const string k_TargetPlatformParam = "-targetPlatform="; const string k_ResultFileDirParam = "-resultsFileDirectory="; public static int returnCodeTestsOk = 0; public static int returnCodeTestsFailed = 2; public static int returnCodeRunError = 3; public static void RunIntegrationTests() { var targetPlatform = GetTargetPlatform(); var otherBuildScenes = GetSceneListFromParam (k_OtherBuildScenesParam); var testScenes = GetSceneListFromParam(k_TestScenesParam); if (testScenes.Count == 0) testScenes = FindTestScenesInProject(); RunIntegrationTests(targetPlatform, testScenes, otherBuildScenes); } public static void RunIntegrationTests(BuildTarget ? targetPlatform) { var sceneList = FindTestScenesInProject(); RunIntegrationTests(targetPlatform, sceneList, new List()); } public static void RunIntegrationTests(BuildTarget? targetPlatform, List testScenes, List otherBuildScenes) { if (targetPlatform.HasValue) BuildAndRun(targetPlatform.Value, testScenes, otherBuildScenes); else RunInEditor(testScenes, otherBuildScenes); } private static void BuildAndRun(BuildTarget target, List testScenes, List otherBuildScenes) { var resultFilePath = GetParameterArgument(k_ResultFileDirParam); const int port = 0; var ipList = TestRunnerConfigurator.GetAvailableNetworkIPs(); var config = new PlatformRunnerConfiguration { buildTarget = target, buildScenes = otherBuildScenes, testScenes = testScenes, projectName = "IntegrationTests", resultsDir = resultFilePath, sendResultsOverNetwork = InternalEditorUtility.inBatchMode, ipList = ipList, port = port }; if (Application.isWebPlayer) { config.sendResultsOverNetwork = false; Debug.Log("You can't use WebPlayer as active platform for running integration tests. Switching to Standalone"); EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.StandaloneWindows); } PlatformRunner.BuildAndRunInPlayer(config); } private static void RunInEditor(List testScenes, List otherBuildScenes) { CheckActiveBuildTarget(); NetworkResultsReceiver.StopReceiver(); if (testScenes == null || testScenes.Count == 0) { Debug.Log("No test scenes on the list"); EditorApplication.Exit(returnCodeRunError); return; } string previousScenesXml = ""; var serializer = new System.Xml.Serialization.XmlSerializer(typeof(EditorBuildSettingsScene[])); using(StringWriter textWriter = new StringWriter()) { serializer.Serialize(textWriter, EditorBuildSettings.scenes); previousScenesXml = textWriter.ToString(); } EditorBuildSettings.scenes = (testScenes.Concat(otherBuildScenes).ToList()).Select(s => new EditorBuildSettingsScene(s, true)).ToArray(); EditorSceneManager.OpenScene(testScenes.First()); GuiHelper.SetConsoleErrorPause(false); var config = new PlatformRunnerConfiguration { resultsDir = GetParameterArgument(k_ResultFileDirParam), ipList = TestRunnerConfigurator.GetAvailableNetworkIPs(), port = PlatformRunnerConfiguration.TryToGetFreePort(), runInEditor = true }; var settings = new PlayerSettingConfigurator(true); settings.AddConfigurationFile(TestRunnerConfigurator.integrationTestsNetwork, string.Join("\n", config.GetConnectionIPs())); settings.AddConfigurationFile(TestRunnerConfigurator.testScenesToRun, string.Join ("\n", testScenes.ToArray())); settings.AddConfigurationFile(TestRunnerConfigurator.previousScenes, previousScenesXml); NetworkResultsReceiver.StartReceiver(config); EditorApplication.isPlaying = true; } private static string GetParameterArgument(string parameterName) { foreach (var arg in Environment.GetCommandLineArgs()) { if (arg.ToLower().StartsWith(parameterName.ToLower())) { return arg.Substring(parameterName.Length); } } return null; } static void CheckActiveBuildTarget() { var notSupportedPlatforms = new[] { "MetroPlayer", "WebPlayer", "WebPlayerStreamed" }; if (notSupportedPlatforms.Contains(EditorUserBuildSettings.activeBuildTarget.ToString())) { Debug.Log("activeBuildTarget can not be " + EditorUserBuildSettings.activeBuildTarget + " use buildTarget parameter to open Unity."); } } private static BuildTarget ? GetTargetPlatform() { string platformString = null; BuildTarget buildTarget; foreach (var arg in Environment.GetCommandLineArgs()) { if (arg.ToLower().StartsWith(k_TargetPlatformParam.ToLower())) { platformString = arg.Substring(k_ResultFilePathParam.Length); break; } } try { if (platformString == null) return null; buildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), platformString); } catch { return null; } return buildTarget; } private static List FindTestScenesInProject() { var integrationTestScenePattern = "*Test?.unity"; return Directory.GetFiles("Assets", integrationTestScenePattern, SearchOption.AllDirectories).ToList(); } private static List GetSceneListFromParam(string param) { var sceneList = new List(); foreach (var arg in Environment.GetCommandLineArgs()) { if (arg.ToLower().StartsWith(param.ToLower())) { var scenesFromParam = arg.Substring(param.Length).Split(','); foreach (var scene in scenesFromParam) { var sceneName = scene; if (!sceneName.EndsWith(".unity")) sceneName += ".unity"; var foundScenes = Directory.GetFiles(Directory.GetCurrentDirectory(), sceneName, SearchOption.AllDirectories); if (foundScenes.Length == 1) sceneList.Add(foundScenes[0].Substring(Directory.GetCurrentDirectory().Length + 1)); else Debug.Log(sceneName + " not found or multiple entries found"); } } } return sceneList.Where(s => !string.IsNullOrEmpty(s)).Distinct().ToList(); } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Batch.cs.meta ================================================ fileFormatVersion: 2 guid: 29d4fb050362c5b43aea52342045543a MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/EditorReferencesUtil.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; namespace UnityTest { public static class EditorReferencesUtil { public static List FindScenesWhichContainAsset(string file) { string assetPath = GetAssetPathFromFileNameAndExtension (file); Object cur = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Object)); return AllScenes.Where(a => ADependsOnB(a, cur)).ToList(); } private static string CleanPathSeparators(string s) { const string forwardSlash = "/"; const string backSlash = "\\"; return s.Replace(backSlash, forwardSlash); } private static string GetRelativeAssetPathFromFullPath(string fullPath) { fullPath = CleanPathSeparators(fullPath); if (fullPath.Contains(Application.dataPath)) { return fullPath.Replace(Application.dataPath, "Assets"); } Debug.LogWarning("Path does not point to a location within Assets: " + fullPath); return null; } private static string GetAssetPathFromFileNameAndExtension(string assetName) { string[] assets = AssetDatabase.FindAssets (Path.GetFileNameWithoutExtension (assetName)); string assetPath = null; foreach (string guid in assets) { string relativePath = AssetDatabase.GUIDToAssetPath (guid); if (Path.GetFileName (relativePath) == Path.GetFileName (assetName)) assetPath = relativePath; } return assetPath; } private static List DirSearch(DirectoryInfo d, string searchFor) { List founditems = d.GetFiles(searchFor).ToList(); // Add (by recursing) subdirectory items. DirectoryInfo[] dis = d.GetDirectories(); foreach (DirectoryInfo di in dis) founditems.AddRange(DirSearch(di, searchFor)); return (founditems); } private static List AllScenes { get { // get every single one of the files in the Assets folder. List files = DirSearch(new DirectoryInfo(Application.dataPath), "*.unity"); // now make them all into Asset references. List assetRefs = new List(); foreach (FileInfo fi in files) { if (fi.Name.StartsWith(".")) continue; // Unity ignores dotfiles. assetRefs.Add(AssetDatabase.LoadMainAssetAtPath(GetRelativeAssetPathFromFullPath(fi.FullName))); } return assetRefs; } } private static bool ADependsOnB(Object obj, Object selectedObj) { if (selectedObj == null) return false; //optionally, exclude self. if (selectedObj == obj) return false; Object[] dependencies = EditorUtility.CollectDependencies(new Object[1] { obj }); if (dependencies.Length < 2) return false; // if there's only one, it's us. foreach (Object dep in dependencies) if (dep == selectedObj) return true; return false; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/EditorReferencesUtil.cs.meta ================================================ fileFormatVersion: 2 guid: aad501c968b324cf3a8d1c52eb09ca04 timeCreated: 1437322927 licenseType: Store MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/GuiHelper.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Cecil.Mdb; using Mono.Collections.Generic; using UnityEditor; using UnityEditorInternal; using UnityEngine; namespace UnityTest { public static class GuiHelper { public static bool GetConsoleErrorPause() { Assembly assembly = Assembly.GetAssembly(typeof(SceneView)); Type type = assembly.GetType("UnityEditorInternal.LogEntries"); PropertyInfo method = type.GetProperty("consoleFlags"); var result = (int)method.GetValue(new object(), new object[] { }); return (result & (1 << 2)) != 0; } public static void SetConsoleErrorPause(bool b) { Assembly assembly = Assembly.GetAssembly(typeof(SceneView)); Type type = assembly.GetType("UnityEditorInternal.LogEntries"); MethodInfo method = type.GetMethod("SetConsoleFlag"); method.Invoke(new object(), new object[] { 1 << 2, b }); } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/GuiHelper.cs.meta ================================================ fileFormatVersion: 2 guid: b0b95014154ef554485afc9c0316556d MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/IntegrationTestsHierarchyAnnotation.cs ================================================ using UnityEngine; using System.Collections; using UnityEditor; namespace UnityTest { [InitializeOnLoad] public class IntegrationTestsHierarchyAnnotation { static IntegrationTestsHierarchyAnnotation() { EditorApplication.hierarchyWindowItemOnGUI += DoAnnotationGUI; } public static void DoAnnotationGUI(int id, Rect rect) { var obj = EditorUtility.InstanceIDToObject(id) as GameObject; if(!obj) return; var tc = obj.GetComponent(); if(!tc) return; if (!EditorApplication.isPlayingOrWillChangePlaymode && rect.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseDown && Event.current.button == 1) { IntegrationTestRendererBase.DrawContextMenu(tc); Event.current.Use (); } EditorGUIUtility.SetIconSize(new Vector2(15, 15)); var result = IntegrationTestsRunnerWindow.GetResultForTest(tc); if (result != null) { var icon = result.Executed ? IntegrationTestRendererBase.GetIconForResult(result.resultType) : Icons.UnknownImg; EditorGUI.LabelField(new Rect(rect.xMax - 18, rect.yMin - 2, rect.width, rect.height), new GUIContent(icon)); } EditorGUIUtility.SetIconSize(Vector2.zero); } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/IntegrationTestsHierarchyAnnotation.cs.meta ================================================ fileFormatVersion: 2 guid: 219cdb080b08741948fc5deb8c7d47f0 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/IntegrationTestsRunnerSettings.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; using UnityEditor; namespace UnityTest { public class IntegrationTestsRunnerSettings : ProjectSettingsBase { public bool blockUIWhenRunning = true; public bool pauseOnTestFailure; public void ToggleBlockUIWhenRunning () { blockUIWhenRunning = !blockUIWhenRunning; Save (); } public void TogglePauseOnTestFailure() { pauseOnTestFailure = !pauseOnTestFailure; Save (); } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/IntegrationTestsRunnerSettings.cs.meta ================================================ fileFormatVersion: 2 guid: 5d01dc4c8f278da489d7d54c83f19cb9 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/IntegrationTestsRunnerWindow.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using UnityEditor; using UnityEngine; using UnityTest.IntegrationTestRunner; using UnityEngine.SceneManagement; namespace UnityTest { [Serializable] public class IntegrationTestsRunnerWindow : EditorWindow, IHasCustomMenu { #region GUI Contents private readonly GUIContent m_GUICreateNewTest = new GUIContent("Create", "Create new test"); private readonly GUIContent m_GUIRunSelectedTests = new GUIContent("Run Selected", "Run selected test(s)"); private readonly GUIContent m_GUIRunAllTests = new GUIContent("Run All", "Run all tests"); private readonly GUIContent m_GUIBlockUI = new GUIContent("Block UI when running", "Block UI when running tests"); private readonly GUIContent m_GUIPauseOnFailure = new GUIContent("Pause on test failure"); #endregion #region runner steerign vars private static IntegrationTestsRunnerWindow s_Instance; [SerializeField] private List m_TestsToRun; [SerializeField] private List m_DynamicTestsToRun; [SerializeField] private bool m_ReadyToRun; private bool m_IsBuilding; public static bool selectedInHierarchy; private float m_HorizontalSplitBarPosition = 200; private Vector2 m_TestInfoScroll, m_TestListScroll; private IntegrationTestRendererBase[] m_TestLines; private string m_CurrectSceneName; private TestFilterSettings m_FilterSettings; Vector2 m_resultTextSize; string m_resultText; GameObject m_lastSelectedGO; int m_resultTestMaxLength = 15000; [SerializeField] private GameObject m_SelectedLine; [SerializeField] private List m_ResultList = new List(); [SerializeField] private List m_FoldMarkers = new List(); private IntegrationTestsRunnerSettings m_Settings; #endregion static IntegrationTestsRunnerWindow() { InitBackgroundRunners(); } private static void InitBackgroundRunners() { EditorApplication.hierarchyWindowItemOnGUI -= OnHierarchyWindowItemDraw; EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyWindowItemDraw; EditorApplication.hierarchyWindowChanged -= OnHierarchyChangeUpdate; EditorApplication.hierarchyWindowChanged += OnHierarchyChangeUpdate; EditorApplication.update -= BackgroundSceneChangeWatch; EditorApplication.update += BackgroundSceneChangeWatch; EditorApplication.playmodeStateChanged -= OnPlaymodeStateChanged; EditorApplication.playmodeStateChanged += OnPlaymodeStateChanged; } private static void OnPlaymodeStateChanged() { if (s_Instance && EditorApplication.isPlaying == EditorApplication.isPlayingOrWillChangePlaymode) s_Instance.RebuildTestList(); } public void OnDestroy() { EditorApplication.hierarchyWindowItemOnGUI -= OnHierarchyWindowItemDraw; EditorApplication.update -= BackgroundSceneChangeWatch; EditorApplication.hierarchyWindowChanged -= OnHierarchyChangeUpdate; EditorApplication.playmodeStateChanged -= OnPlaymodeStateChanged; TestComponent.DestroyAllDynamicTests(); } private static void BackgroundSceneChangeWatch() { if (!s_Instance) return; var currentScene = SceneManager.GetActiveScene().path; if (s_Instance.m_CurrectSceneName != null && s_Instance.m_CurrectSceneName == currentScene) return; if (EditorApplication.isPlayingOrWillChangePlaymode) return; TestComponent.DestroyAllDynamicTests(); s_Instance.m_CurrectSceneName = currentScene; s_Instance.m_ResultList.Clear(); s_Instance.RebuildTestList(); } public void OnEnable() { titleContent = new GUIContent("Integration Tests"); s_Instance = this; m_Settings = ProjectSettingsBase.Load(); m_FilterSettings = new TestFilterSettings("UnityTest.IntegrationTestsRunnerWindow"); InitBackgroundRunners(); if (!EditorApplication.isPlayingOrWillChangePlaymode && !m_ReadyToRun) RebuildTestList(); } public void OnSelectionChange() { if (EditorApplication.isPlayingOrWillChangePlaymode || Selection.objects == null || Selection.objects.Length == 0) return; if (Selection.gameObjects.Length == 1) { var go = Selection.gameObjects.Single(); var temp = go.transform; while (temp != null) { var tc = temp.GetComponent(); if (tc != null) break; temp = temp.parent; } if (temp != null) { SelectInHierarchy(temp.gameObject); Selection.activeGameObject = temp.gameObject; m_SelectedLine = temp.gameObject; } } } public static void OnHierarchyChangeUpdate() { if (!s_Instance || s_Instance.m_TestLines == null || EditorApplication.isPlayingOrWillChangePlaymode) return; // create a test runner if it doesn't exist TestRunner.GetTestRunner(); // make tests are not places under a go that is not a test itself foreach (var test in TestComponent.FindAllTestsOnScene()) { if (test.gameObject.transform.parent != null && test.gameObject.transform.parent.gameObject.GetComponent() == null) { test.gameObject.transform.parent = null; Debug.LogWarning("Tests need to be on top of the hierarchy or directly under another test."); } } if (selectedInHierarchy) selectedInHierarchy = false; else s_Instance.RebuildTestList(); } public static TestResult GetResultForTest(TestComponent tc) { if(!s_Instance) return new TestResult(tc); return s_Instance.m_ResultList.FirstOrDefault(r => r.GameObject == tc.gameObject); } public static void OnHierarchyWindowItemDraw(int id, Rect rect) { var o = EditorUtility.InstanceIDToObject(id); if (o is GameObject) { var go = o as GameObject; if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && rect.Contains(Event.current.mousePosition)) { var temp = go.transform; while (temp != null) { var c = temp.GetComponent(); if (c != null) break; temp = temp.parent; } if (temp != null) SelectInHierarchy(temp.gameObject); } } } private static void SelectInHierarchy(GameObject gameObject) { if (!s_Instance) return; if (gameObject == s_Instance.m_SelectedLine && gameObject.activeInHierarchy) return; if (EditorApplication.isPlayingOrWillChangePlaymode) return; if (!gameObject.activeSelf) { selectedInHierarchy = true; gameObject.SetActive(true); } var tests = TestComponent.FindAllTestsOnScene(); var skipList = gameObject.GetComponentsInChildren(typeof(TestComponent), true).ToList(); tests.RemoveAll(skipList.Contains); foreach (var test in tests) { var enable = test.GetComponentsInChildren(typeof(TestComponent), true).Any(c => c.gameObject == gameObject); if (test.gameObject.activeSelf != enable) test.gameObject.SetActive(enable); } } private void RunTests(IList tests) { if (!tests.Any() || EditorApplication.isCompiling || EditorApplication.isPlayingOrWillChangePlaymode) return; FocusWindowIfItsOpen(GetType()); var testComponents = tests.Where(t => t is TestComponent).Cast().ToList(); var dynaminTests = testComponents.Where(t => t.dynamic).ToList(); m_DynamicTestsToRun = dynaminTests.Select(c => c.dynamicTypeName).ToList(); testComponents.RemoveAll(dynaminTests.Contains); m_TestsToRun = testComponents.Select( tc => tc.gameObject ).ToList(); m_ReadyToRun = true; TestComponent.DisableAllTests(); EditorApplication.isPlaying = true; } public void Update() { if (m_ReadyToRun && EditorApplication.isPlaying) { m_ReadyToRun = false; var testRunner = TestRunner.GetTestRunner(); testRunner.TestRunnerCallback.Add(new RunnerCallback(this)); var testComponents = m_TestsToRun.Select(go => go.GetComponent()).ToList(); testRunner.InitRunner(testComponents, m_DynamicTestsToRun); } } private void RebuildTestList() { m_TestLines = null; if (!TestComponent.AnyTestsOnScene() && !TestComponent.AnyDynamicTestForCurrentScene()) return; if (!EditorApplication.isPlayingOrWillChangePlaymode) { var dynamicTestsOnScene = TestComponent.FindAllDynamicTestsOnScene(); var dynamicTestTypes = TestComponent.GetTypesWithHelpAttribute(SceneManager.GetActiveScene().path); foreach (var dynamicTestType in dynamicTestTypes) { var existingTests = dynamicTestsOnScene.Where(component => component.dynamicTypeName == dynamicTestType.AssemblyQualifiedName); if (existingTests.Any()) { var testComponent = existingTests.Single(); foreach (var c in testComponent.gameObject.GetComponents()) { var type = Type.GetType(testComponent.dynamicTypeName); if (c is TestComponent || c is Transform || type.IsInstanceOfType(c)) continue; DestroyImmediate(c); } dynamicTestsOnScene.Remove(existingTests.Single()); continue; } TestComponent.CreateDynamicTest(dynamicTestType); } foreach (var testComponent in dynamicTestsOnScene) DestroyImmediate(testComponent.gameObject); } var topTestList = TestComponent.FindAllTopTestsOnScene(); var newResultList = new List(); m_TestLines = ParseTestList(topTestList, newResultList); var oldDynamicResults = m_ResultList.Where(result => result.dynamicTest); foreach (var oldResult in m_ResultList) { var result = newResultList.Find(r => r.Id == oldResult.Id); if (result == null) continue; result.Update(oldResult); } newResultList.AddRange(oldDynamicResults.Where(r => !newResultList.Contains(r))); m_ResultList = newResultList; IntegrationTestRendererBase.RunTest = RunTests; IntegrationTestGroupLine.FoldMarkers = m_FoldMarkers; IntegrationTestLine.Results = m_ResultList; m_FilterSettings.UpdateCounters(m_ResultList.Cast()); m_FoldMarkers.RemoveAll(o => o == null); selectedInHierarchy = true; Repaint(); } private IntegrationTestRendererBase[] ParseTestList(List testList, List results) { var tempList = new List(); foreach (var testObject in testList) { if (!testObject.IsTestGroup()) { var result = new TestResult(testObject); if (results != null) results.Add(result); tempList.Add(new IntegrationTestLine(testObject.gameObject, result)); continue; } var group = new IntegrationTestGroupLine(testObject.gameObject); var children = testObject.gameObject.GetComponentsInChildren(typeof(TestComponent), true).Cast().ToList(); children = children.Where(c => c.gameObject.transform.parent == testObject.gameObject.transform).ToList(); group.AddChildren(ParseTestList(children, results)); tempList.Add(group); } tempList.Sort(); return tempList.ToArray(); } public void OnGUI() { if (BuildPipeline.isBuildingPlayer) { m_IsBuilding = true; } else if (m_IsBuilding) { m_IsBuilding = false; Repaint(); } PrintHeadPanel(); EditorGUILayout.BeginVertical(Styles.testList); m_TestListScroll = EditorGUILayout.BeginScrollView(m_TestListScroll); bool repaint = PrintTestList(m_TestLines); GUILayout.FlexibleSpace(); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); RenderDetails(); if (repaint) Repaint(); } public void PrintHeadPanel() { EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); EditorGUI.BeginDisabledGroup(EditorApplication.isPlayingOrWillChangePlaymode); if (GUILayout.Button(m_GUIRunAllTests, EditorStyles.toolbarButton)) { RunTests(TestComponent.FindAllTestsOnScene().Cast().ToList()); } EditorGUI.BeginDisabledGroup(!Selection.gameObjects.Any (t => t.GetComponent(typeof(ITestComponent)))); if (GUILayout.Button(m_GUIRunSelectedTests, EditorStyles.toolbarButton)) { RunTests(Selection.gameObjects.Select(t => t.GetComponent(typeof(TestComponent))).Cast().ToList()); } EditorGUI.EndDisabledGroup(); if (GUILayout.Button(m_GUICreateNewTest, EditorStyles.toolbarButton)) { var test = TestComponent.CreateTest(); if (Selection.gameObjects.Length == 1 && Selection.activeGameObject != null && Selection.activeGameObject.GetComponent()) { test.transform.parent = Selection.activeGameObject.transform.parent; } Selection.activeGameObject = test; RebuildTestList(); } EditorGUI.EndDisabledGroup(); GUILayout.FlexibleSpace (); m_FilterSettings.OnGUI (); EditorGUILayout.EndHorizontal (); } public void AddItemsToMenu(GenericMenu menu) { menu.AddItem(m_GUIBlockUI, m_Settings.blockUIWhenRunning, m_Settings.ToggleBlockUIWhenRunning); menu.AddItem(m_GUIPauseOnFailure, m_Settings.pauseOnTestFailure, m_Settings.TogglePauseOnTestFailure); } private bool PrintTestList(IntegrationTestRendererBase[] renderedLines) { if (renderedLines == null) return false; var filter = m_FilterSettings.BuildRenderingOptions(); bool repaint = false; foreach (var renderedLine in renderedLines) { repaint |= renderedLine.Render(filter); } return repaint; } private void RenderDetails() { var ctrlId = GUIUtility.GetControlID(FocusType.Passive); Rect rect = GUILayoutUtility.GetLastRect(); rect.y = rect.height + rect.y - 1; rect.height = 3; EditorGUIUtility.AddCursorRect(rect, MouseCursor.ResizeVertical); var e = Event.current; switch (e.type) { case EventType.MouseDown: if (GUIUtility.hotControl == 0 && rect.Contains(e.mousePosition)) GUIUtility.hotControl = ctrlId; break; case EventType.MouseDrag: if (GUIUtility.hotControl == ctrlId) { m_HorizontalSplitBarPosition -= e.delta.y; if (m_HorizontalSplitBarPosition < 20) m_HorizontalSplitBarPosition = 20; Repaint(); } break; case EventType.MouseUp: if (GUIUtility.hotControl == ctrlId) GUIUtility.hotControl = 0; break; } m_TestInfoScroll = EditorGUILayout.BeginScrollView(m_TestInfoScroll, GUILayout.MinHeight(m_HorizontalSplitBarPosition)); if (m_SelectedLine != null) UpdateResultText(m_SelectedLine); EditorGUILayout.SelectableLabel(m_resultText, Styles.info, GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true), GUILayout.MinWidth(m_resultTextSize.x), GUILayout.MinHeight(m_resultTextSize.y)); EditorGUILayout.EndScrollView(); } private void UpdateResultText(GameObject go) { if(go == m_lastSelectedGO) return; m_lastSelectedGO = go; var result = m_ResultList.Find(r => r.GameObject == go); if (result == null) { m_resultText = string.Empty; m_resultTextSize = Styles.info.CalcSize(new GUIContent(string.Empty)); return; } var sb = new StringBuilder(result.Name.Trim()); 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(sb.Length>m_resultTestMaxLength) { sb.Length = m_resultTestMaxLength; sb.AppendFormat("...\n\n---MESSAGE TRUNCATED AT {0} CHARACTERS---", m_resultTestMaxLength); } m_resultText = sb.ToString().Trim(); m_resultTextSize = Styles.info.CalcSize(new GUIContent(m_resultText)); } public void OnInspectorUpdate() { if (focusedWindow != this) Repaint(); } private void SetCurrentTest(TestComponent tc) { foreach (var line in m_TestLines) line.SetCurrentTest(tc); } class RunnerCallback : ITestRunnerCallback { private readonly IntegrationTestsRunnerWindow m_Window; private int m_TestNumber; private int m_CurrentTestNumber; private readonly bool m_ConsoleErrorOnPauseValue; private readonly bool m_RunInBackground; private TestComponent m_CurrentTest; public RunnerCallback(IntegrationTestsRunnerWindow window) { m_Window = window; m_ConsoleErrorOnPauseValue = GuiHelper.GetConsoleErrorPause(); GuiHelper.SetConsoleErrorPause(false); m_RunInBackground = PlayerSettings.runInBackground; PlayerSettings.runInBackground = true; } public void RunStarted(string platform, List testsToRun) { EditorApplication.update += OnEditorUpdate; m_TestNumber = testsToRun.Count; foreach (var test in testsToRun) { var result = m_Window.m_ResultList.Find(r => r.TestComponent == test); if (result != null) result.Reset(); } } public void RunFinished(List testResults) { m_Window.SetCurrentTest(null); m_CurrentTest = null; EditorApplication.update -= OnEditorUpdate; EditorApplication.isPlaying = false; EditorUtility.ClearProgressBar(); GuiHelper.SetConsoleErrorPause(m_ConsoleErrorOnPauseValue); PlayerSettings.runInBackground = m_RunInBackground; } public void AllScenesFinished() { } public void TestStarted(TestResult test) { m_Window.SetCurrentTest(test.TestComponent); m_CurrentTest = test.TestComponent; } public void TestFinished(TestResult test) { m_CurrentTestNumber++; var result = m_Window.m_ResultList.Find(r => r.Id == test.Id); if (result != null) result.Update(test); else m_Window.m_ResultList.Add(test); if(test.IsFailure && m_Window.m_Settings.pauseOnTestFailure) { EditorUtility.ClearProgressBar(); EditorApplication.isPaused = true; } } public void TestRunInterrupted(List testsNotRun) { Debug.Log("Test run interrupted"); RunFinished(new List()); } private void OnEditorUpdate() { if(!EditorApplication.isPlaying) { TestRunInterrupted(null); return; } if (m_Window.m_Settings.blockUIWhenRunning && m_CurrentTest != null && !EditorApplication.isPaused && EditorUtility.DisplayCancelableProgressBar("Integration Test Runner", "Running " + m_CurrentTest.Name, (float)m_CurrentTestNumber / m_TestNumber)) { TestRunInterrupted(null); } } } [MenuItem("Unity Test Tools/Integration Test Runner %#&t")] public static IntegrationTestsRunnerWindow ShowWindow() { var w = GetWindow(typeof(IntegrationTestsRunnerWindow)); w.Show(); return w as IntegrationTestsRunnerWindow; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/IntegrationTestsRunnerWindow.cs.meta ================================================ fileFormatVersion: 2 guid: 2c898357efb599944818326bb43ba879 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/NetworkResultsReceiver.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using UnityEditor; using UnityEditorInternal; using UnityEngine; namespace UnityTest { [Serializable] public class NetworkResultsReceiver : EditorWindow { public static NetworkResultsReceiver Instance; private string m_StatusLabel; private TcpListener m_Listener; [SerializeField] private PlatformRunnerConfiguration m_Configuration; private List m_TestResults = new List(); #region steering variables private bool m_RunFinished; private bool m_Repaint; private TimeSpan m_TestTimeout = TimeSpan.Zero; private DateTime m_LastMessageReceived; private bool m_Running; public TimeSpan ReceiveMessageTimeout = TimeSpan.FromSeconds(30); private readonly TimeSpan m_InitialConnectionTimeout = TimeSpan.FromSeconds(300); private bool m_TestFailed; #endregion private void AcceptCallback(TcpClient client) { m_Repaint = true; ResultDTO dto; try { m_LastMessageReceived = DateTime.Now; using (var stream = client.GetStream()) { var bf = new DTOFormatter(); dto = (ResultDTO)bf.Deserialize(stream); stream.Close(); } client.Close(); } catch (ObjectDisposedException e) { Debug.LogException(e); m_StatusLabel = "Got disconnected"; return; } catch (Exception e) { Debug.LogException(e); return; } switch (dto.messageType) { case ResultDTO.MessageType.TestStarted: m_StatusLabel = dto.testName; m_TestTimeout = TimeSpan.FromSeconds(dto.testTimeout); break; case ResultDTO.MessageType.TestFinished: m_TestResults.Add(dto.testResult); m_TestTimeout = TimeSpan.Zero; if (dto.testResult.Executed && dto.testResult.ResultState != TestResultState.Ignored && !dto.testResult.IsSuccess) m_TestFailed = true; break; case ResultDTO.MessageType.RunStarted: m_TestResults = new List(); m_StatusLabel = "Run started: " + dto.loadedLevelName; break; case ResultDTO.MessageType.RunFinished: WriteResultsToLog(dto, m_TestResults); if (!string.IsNullOrEmpty(m_Configuration.resultsDir)) { var platform = m_Configuration.runInEditor ? "Editor" : m_Configuration.buildTarget.ToString(); var resultWriter = new XmlResultWriter(dto.loadedLevelName, platform, m_TestResults.ToArray()); try { if (!Directory.Exists(m_Configuration.resultsDir)) { Directory.CreateDirectory(m_Configuration.resultsDir); } var filePath = Path.Combine(m_Configuration.resultsDir, dto.loadedLevelName + ".xml"); File.WriteAllText(filePath, resultWriter.GetTestResult()); } catch (Exception e) { Debug.LogException(e); } } break; case ResultDTO.MessageType.AllScenesFinished: m_Running = false; m_RunFinished = true; break; case ResultDTO.MessageType.Ping: break; } } private void WriteResultsToLog(ResultDTO dto, List list) { string result = "Run finished for: " + dto.loadedLevelName; var failCount = list.Count(t => t.Executed && !t.IsSuccess); if (failCount == 0) result += "\nAll tests passed"; else result += "\n" + failCount + " tests failed"; if (failCount == 0) Debug.Log(result); else Debug.LogWarning(result); } public void Update() { if (EditorApplication.isCompiling && m_Listener != null) { m_Running = false; m_Listener.Stop(); return; } if (m_Running) { try { if (m_Listener != null && m_Listener.Pending()) { using (var client = m_Listener.AcceptTcpClient()) { AcceptCallback(client); client.Close(); } } } catch (InvalidOperationException e) { m_StatusLabel = "Exception happened: " + e.Message; Repaint(); Debug.LogException(e); } } if (m_Running) { var adjustedtestTimeout = m_TestTimeout.Add(m_TestTimeout); var timeout = ReceiveMessageTimeout > adjustedtestTimeout ? ReceiveMessageTimeout : adjustedtestTimeout; if ((DateTime.Now - m_LastMessageReceived) > timeout) { Debug.LogError("Timeout when waiting for test results"); m_RunFinished = true; } } if (m_RunFinished) { Close(); if (InternalEditorUtility.inBatchMode) EditorApplication.Exit(m_TestFailed ? Batch.returnCodeTestsFailed : Batch.returnCodeTestsOk); } if (m_Repaint) Repaint(); } public void OnEnable() { minSize = new Vector2(300, 100); titleContent = new GUIContent("Test run monitor"); Instance = this; m_StatusLabel = "Initializing..."; if (EditorApplication.isCompiling) return; EnableServer(); } private void EnableServer() { if (m_Configuration == null) throw new Exception("No result receiver server configuration."); var ipAddress = IPAddress.Any; if (m_Configuration.ipList != null && m_Configuration.ipList.Count == 1) ipAddress = IPAddress.Parse(m_Configuration.ipList.Single()); var ipAddStr = Equals(ipAddress, IPAddress.Any) ? "[All interfaces]" : ipAddress.ToString(); m_Listener = new TcpListener(ipAddress, m_Configuration.port); m_StatusLabel = "Waiting for connection on: " + ipAddStr + ":" + m_Configuration.port; try { m_Listener.Start(100); } catch (SocketException e) { m_StatusLabel = "Exception happened: " + e.Message; Repaint(); Debug.LogException(e); } m_Running = true; m_LastMessageReceived = DateTime.Now + m_InitialConnectionTimeout; } public void OnDisable() { Instance = null; if (m_Listener != null) m_Listener.Stop(); } public void OnGUI() { EditorGUILayout.LabelField("Status:", EditorStyles.boldLabel); EditorGUILayout.LabelField(m_StatusLabel); GUILayout.FlexibleSpace(); if (GUILayout.Button("Stop")) { StopReceiver(); if (InternalEditorUtility.inBatchMode) EditorApplication.Exit(Batch.returnCodeRunError); } } public static void StartReceiver(PlatformRunnerConfiguration configuration) { var w = (NetworkResultsReceiver)GetWindow(typeof(NetworkResultsReceiver), false); w.SetConfiguration(configuration); if (!EditorApplication.isCompiling) { w.EnableServer(); } w.Show(true); } private void SetConfiguration(PlatformRunnerConfiguration configuration) { m_Configuration = configuration; } public static void StopReceiver() { if (Instance == null) return; try{ Instance.Close(); }catch(Exception e){ Debug.LogException(e); DestroyImmediate(Instance); } } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/NetworkResultsReceiver.cs.meta ================================================ fileFormatVersion: 2 guid: ade4197221f35dc44adb7649f99af2e7 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlatformRunner.cs ================================================ using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using UnityEditor; using UnityEditorInternal; using UnityEngine; using System.Linq; namespace UnityTest.IntegrationTests { public class PlatformRunner { public static BuildTarget defaultBuildTarget { get { var target = EditorPrefs.GetString("ITR-platformRunnerBuildTarget"); BuildTarget buildTarget; try { buildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), target); } catch { return GetDefaultBuildTarget(); } return buildTarget; } set { EditorPrefs.SetString("ITR-platformRunnerBuildTarget", value.ToString()); } } [MenuItem("Unity Test Tools/Platform Runner/Run current scene %#&r")] public static void BuildAndRunCurrentScene() { Debug.Log("Building and running current test for " + defaultBuildTarget); BuildAndRunInPlayer(new PlatformRunnerConfiguration(defaultBuildTarget)); } [MenuItem("Unity Test Tools/Platform Runner/Run on platform %#r")] public static void RunInPlayer() { var w = EditorWindow.GetWindow(typeof(PlatformRunnerSettingsWindow)); w.Show(); } public static void BuildAndRunInPlayer(PlatformRunnerConfiguration configuration) { NetworkResultsReceiver.StopReceiver(); var settings = new PlayerSettingConfigurator(false); if (configuration.sendResultsOverNetwork) { try { var l = new TcpListener(IPAddress.Any, configuration.port); l.Start(); configuration.port = ((IPEndPoint)l.Server.LocalEndPoint).Port; l.Stop(); } catch (SocketException e) { Debug.LogException(e); if (InternalEditorUtility.inBatchMode) EditorApplication.Exit(Batch.returnCodeRunError); } } if (InternalEditorUtility.inBatchMode) settings.AddConfigurationFile(TestRunnerConfigurator.batchRunFileMarker, ""); if (configuration.sendResultsOverNetwork) settings.AddConfigurationFile(TestRunnerConfigurator.integrationTestsNetwork, string.Join("\n", configuration.GetConnectionIPs())); settings.AddConfigurationFile (TestRunnerConfigurator.testScenesToRun, string.Join ("\n", configuration.testScenes.ToArray())); settings.ChangeSettingsForIntegrationTests(); AssetDatabase.Refresh(); var result = BuildPipeline.BuildPlayer(configuration.testScenes.Concat(configuration.buildScenes).ToArray(), configuration.GetTempPath(), configuration.buildTarget, BuildOptions.AutoRunPlayer | BuildOptions.Development); settings.RevertSettingsChanges(); settings.RemoveAllConfigurationFiles(); AssetDatabase.Refresh(); if (!string.IsNullOrEmpty(result)) { if (InternalEditorUtility.inBatchMode) EditorApplication.Exit(Batch.returnCodeRunError); return; } if (configuration.sendResultsOverNetwork) NetworkResultsReceiver.StartReceiver(configuration); else if (InternalEditorUtility.inBatchMode) EditorApplication.Exit(Batch.returnCodeTestsOk); } private static BuildTarget GetDefaultBuildTarget() { switch (EditorUserBuildSettings.selectedBuildTargetGroup) { case BuildTargetGroup.Android: return BuildTarget.Android; default: { switch (Application.platform) { case RuntimePlatform.WindowsPlayer: return BuildTarget.StandaloneWindows; case RuntimePlatform.OSXPlayer: return BuildTarget.StandaloneOSXIntel; case RuntimePlatform.LinuxPlayer: return BuildTarget.StandaloneLinux; } return BuildTarget.WebGL; } } } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlatformRunner.cs.meta ================================================ fileFormatVersion: 2 guid: a3581fa3f207a8a4c9988b9f59a510d3 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlatformRunnerConfiguration.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; [Serializable] public class PlatformRunnerConfiguration { public List buildScenes; public List testScenes; public BuildTarget buildTarget; public bool runInEditor; public string projectName = SceneManager.GetActiveScene().path; public string resultsDir = null; public bool sendResultsOverNetwork; public List ipList; public int port; public PlatformRunnerConfiguration(BuildTarget buildTarget) { this.buildTarget = buildTarget; projectName = SceneManager.GetActiveScene().path; } public PlatformRunnerConfiguration() : this(BuildTarget.StandaloneWindows) { } public string GetTempPath() { if (string.IsNullOrEmpty(projectName)) projectName = Path.GetTempFileName(); var path = Path.Combine("Temp", projectName); switch (buildTarget) { case BuildTarget.StandaloneWindows: case BuildTarget.StandaloneWindows64: return path + ".exe"; case BuildTarget.StandaloneOSXIntel: case BuildTarget.StandaloneOSXIntel64: case BuildTarget.StandaloneLinuxUniversal: return path + ".app"; case BuildTarget.Android: return path + ".apk"; default: return path; } } public string[] GetConnectionIPs() { return ipList.Select(ip => ip + ":" + port).ToArray(); } public static int TryToGetFreePort() { var port = -1; try { var l = new TcpListener(IPAddress.Any, 0); l.Start(); port = ((IPEndPoint)l.Server.LocalEndPoint).Port; l.Stop(); } catch (SocketException e) { Debug.LogException(e); } return port; } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlatformRunnerConfiguration.cs.meta ================================================ fileFormatVersion: 2 guid: b98fe8c3761da2d4b8cfd8bd6df7050f MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlatformRunnerSettings.cs ================================================ using System; using UnityEngine; namespace UnityTest { public class PlatformRunnerSettings : ProjectSettingsBase { public string resultsPath; public bool sendResultsOverNetwork = true; public int port = 0; } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlatformRunnerSettings.cs.meta ================================================ fileFormatVersion: 2 guid: 964f5f0db2c95bb41aa3dc3beba1f06b MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlatformRunnerSettingsWindow.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; using UnityEngine.SceneManagement; namespace UnityTest.IntegrationTests { [Serializable] public class PlatformRunnerSettingsWindow : EditorWindow { private BuildTarget m_BuildTarget; private List m_IntegrationTestScenes; private List m_OtherScenesToBuild; private List m_AllScenesInProject; private Vector2 m_ScrollPositionIntegrationTests; private Vector2 m_ScrollPositionOtherScenes; private Vector2 m_ScrollPositionAllScenes; private readonly List m_Interfaces = new List(); private readonly List m_SelectedScenes = new List(); private int m_SelectedInterface; [SerializeField] private bool m_AdvancedNetworkingSettings; private PlatformRunnerSettings m_Settings; private string m_SelectedSceneInAll; private string m_SelectedSceneInTest; private string m_SelectedSceneInBuild; readonly GUIContent m_Label = new GUIContent("Results target directory", "Directory where the results will be saved. If no value is specified, the results will be generated in project's data folder."); void Awake() { if (m_OtherScenesToBuild == null) m_OtherScenesToBuild = new List (); if (m_IntegrationTestScenes == null) m_IntegrationTestScenes = new List (); titleContent = new GUIContent("Platform runner"); m_BuildTarget = PlatformRunner.defaultBuildTarget; position.Set(position.xMin, position.yMin, 200, position.height); m_AllScenesInProject = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.unity", SearchOption.AllDirectories).ToList(); m_AllScenesInProject.Sort(); var currentScene = (Directory.GetCurrentDirectory() + SceneManager.GetActiveScene().path).Replace("\\", "").Replace("/", ""); var currentScenePath = m_AllScenesInProject.Where(s => s.Replace("\\", "").Replace("/", "") == currentScene); m_SelectedScenes.AddRange(currentScenePath); m_Interfaces.Add("(Any)"); m_Interfaces.AddRange(TestRunnerConfigurator.GetAvailableNetworkIPs()); m_Interfaces.Add("127.0.0.1"); LoadFromPrefereneces (); } public void OnEnable() { m_Settings = ProjectSettingsBase.Load(); // If not configured pre populate with all scenes that have test components on game objects // This needs to be done outsie of constructor if (m_IntegrationTestScenes.Count == 0) m_IntegrationTestScenes = GetScenesWithTestComponents (m_AllScenesInProject); } public void OnGUI() { EditorGUILayout.BeginVertical(); GUIContent label; /* We have three lists here, The tests to run, supporting scenes to include in the build and the list of all scenes so users can * pick the scenes they want to include. The motiviation here is that test scenes may require to additively load other scenes as part of the tests */ EditorGUILayout.BeginHorizontal (); // Integration Tests To Run EditorGUILayout.BeginVertical (); label = new GUIContent("Tests:", "All Integration Test scenes that you wish to run on the platform"); EditorGUILayout.LabelField(label, EditorStyles.boldLabel, GUILayout.Height(20f)); EditorGUI.BeginDisabledGroup(string.IsNullOrEmpty(m_SelectedSceneInTest)); if (GUILayout.Button("Remove Integration Test")) { m_IntegrationTestScenes.Remove(m_SelectedSceneInTest); m_SelectedSceneInTest = ""; } EditorGUI.EndDisabledGroup(); DrawVerticalSceneList (ref m_IntegrationTestScenes, ref m_SelectedSceneInTest, ref m_ScrollPositionIntegrationTests); EditorGUILayout.EndVertical (); // Extra scenes to include in build EditorGUILayout.BeginVertical (); label = new GUIContent("Other Scenes in Build:", "If your Integration Tests additivly load any other scenes then you want to include them here so they are part of the build"); EditorGUILayout.LabelField(label, EditorStyles.boldLabel, GUILayout.Height(20f)); EditorGUI.BeginDisabledGroup(string.IsNullOrEmpty(m_SelectedSceneInBuild)); if (GUILayout.Button("Remove From Build")) { m_OtherScenesToBuild.Remove(m_SelectedSceneInBuild); m_SelectedSceneInBuild = ""; } EditorGUI.EndDisabledGroup(); DrawVerticalSceneList (ref m_OtherScenesToBuild, ref m_SelectedSceneInBuild, ref m_ScrollPositionOtherScenes); EditorGUILayout.EndVertical (); EditorGUILayout.Separator (); // All Scenes EditorGUILayout.BeginVertical (); label = new GUIContent("Available Scenes", "These are all the scenes within your project, please select some to run tests"); EditorGUILayout.LabelField(label, EditorStyles.boldLabel, GUILayout.Height(20f)); EditorGUILayout.BeginHorizontal (); EditorGUI.BeginDisabledGroup(string.IsNullOrEmpty(m_SelectedSceneInAll)); if (GUILayout.Button("Add As Test")) { if (!m_IntegrationTestScenes.Contains (m_SelectedSceneInAll) && !m_OtherScenesToBuild.Contains (m_SelectedSceneInAll)) { m_IntegrationTestScenes.Add(m_SelectedSceneInAll); } } if (GUILayout.Button("Add to Build")) { if (!m_IntegrationTestScenes.Contains (m_SelectedSceneInAll) && !m_OtherScenesToBuild.Contains (m_SelectedSceneInAll)) { m_OtherScenesToBuild.Add(m_SelectedSceneInAll); } } EditorGUI.EndDisabledGroup(); EditorGUILayout.EndHorizontal (); DrawVerticalSceneList (ref m_AllScenesInProject, ref m_SelectedSceneInAll, ref m_ScrollPositionAllScenes); EditorGUILayout.EndVertical (); // ButtoNetworkResultsReceiverns to edit scenes in lists EditorGUILayout.EndHorizontal (); GUILayout.Space(3); // Select target platform m_BuildTarget = (BuildTarget)EditorGUILayout.EnumPopup("Build tests for", m_BuildTarget); if (PlatformRunner.defaultBuildTarget != m_BuildTarget) { if (GUILayout.Button("Make default target platform")) { PlatformRunner.defaultBuildTarget = m_BuildTarget; } } GUI.enabled = true; // Select various Network settings DrawSetting(); var build = GUILayout.Button("Build and run tests"); EditorGUILayout.EndVertical(); if (build) { BuildAndRun (); } } private void DrawVerticalSceneList(ref List sourceList, ref string selectString, ref Vector2 scrollPosition) { scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, Styles.testList); EditorGUI.indentLevel++; foreach (var scenePath in sourceList) { var path = Path.GetFileNameWithoutExtension(scenePath); var guiContent = new GUIContent(path, scenePath); var rect = GUILayoutUtility.GetRect(guiContent, EditorStyles.label); if (rect.Contains(Event.current.mousePosition)) { if (Event.current.type == EventType.mouseDown && Event.current.button == 0) { selectString = scenePath; Event.current.Use(); } } var style = new GUIStyle(EditorStyles.label); if (selectString == scenePath) style.normal.textColor = new Color(0.3f, 0.5f, 0.85f); EditorGUI.LabelField(rect, guiContent, style); } EditorGUI.indentLevel--; EditorGUILayout.EndScrollView(); } public static List GetScenesWithTestComponents(List allScenes) { List results = EditorReferencesUtil.FindScenesWhichContainAsset("TestComponent.cs"); List integrationTestScenes = new List(); foreach (Object obj in results) { string result = allScenes.FirstOrDefault(s => s.Contains(obj.name)); if (!string.IsNullOrEmpty(result)) integrationTestScenes.Add(result); } return integrationTestScenes; } private void DrawSetting() { EditorGUI.BeginChangeCheck(); EditorGUILayout.BeginHorizontal(); m_Settings.resultsPath = EditorGUILayout.TextField(m_Label, m_Settings.resultsPath); if (GUILayout.Button("Search", EditorStyles.miniButton, GUILayout.Width(50))) { var selectedPath = EditorUtility.SaveFolderPanel("Result files destination", m_Settings.resultsPath, ""); if (!string.IsNullOrEmpty(selectedPath)) m_Settings.resultsPath = Path.GetFullPath(selectedPath); } EditorGUILayout.EndHorizontal(); if (!string.IsNullOrEmpty(m_Settings.resultsPath)) { Uri uri; if (!Uri.TryCreate(m_Settings.resultsPath, UriKind.Absolute, out uri) || !uri.IsFile || uri.IsWellFormedOriginalString()) { EditorGUILayout.HelpBox("Invalid URI path", MessageType.Warning); } } m_Settings.sendResultsOverNetwork = EditorGUILayout.Toggle("Send results to editor", m_Settings.sendResultsOverNetwork); EditorGUI.BeginDisabledGroup(!m_Settings.sendResultsOverNetwork); m_AdvancedNetworkingSettings = EditorGUILayout.Foldout(m_AdvancedNetworkingSettings, "Advanced network settings"); if (m_AdvancedNetworkingSettings) { m_SelectedInterface = EditorGUILayout.Popup("Network interface", m_SelectedInterface, m_Interfaces.ToArray()); EditorGUI.BeginChangeCheck(); m_Settings.port = EditorGUILayout.IntField("Network port", m_Settings.port); if (EditorGUI.EndChangeCheck()) { if (m_Settings.port > IPEndPoint.MaxPort) m_Settings.port = IPEndPoint.MaxPort; else if (m_Settings.port < IPEndPoint.MinPort) m_Settings.port = IPEndPoint.MinPort; } } EditorGUI.EndDisabledGroup(); if (EditorGUI.EndChangeCheck()) { m_Settings.Save(); } } private void BuildAndRun() { SaveToPreferences (); var config = new PlatformRunnerConfiguration { buildTarget = m_BuildTarget, buildScenes = m_OtherScenesToBuild, testScenes = m_IntegrationTestScenes, projectName = m_IntegrationTestScenes.Count > 1 ? "IntegrationTests" : Path.GetFileNameWithoutExtension(SceneManager.GetActiveScene().path), resultsDir = m_Settings.resultsPath, sendResultsOverNetwork = m_Settings.sendResultsOverNetwork, ipList = m_Interfaces.Skip(1).ToList(), port = m_Settings.port }; if (m_SelectedInterface > 0) config.ipList = new List {m_Interfaces.ElementAt(m_SelectedInterface)}; PlatformRunner.BuildAndRunInPlayer(config); Close (); } public void OnLostFocus() { SaveToPreferences (); } public void OnDestroy() { SaveToPreferences (); } private void SaveToPreferences() { EditorPrefs.SetString (Animator.StringToHash (Application.dataPath + "uttTestScenes").ToString (), String.Join (",",m_IntegrationTestScenes.ToArray())); EditorPrefs.SetString (Animator.StringToHash (Application.dataPath + "uttBuildScenes").ToString (), String.Join (",",m_OtherScenesToBuild.ToArray())); } private void LoadFromPrefereneces() { string storedTestScenes = EditorPrefs.GetString (Animator.StringToHash (Application.dataPath + "uttTestScenes").ToString ()); string storedBuildScenes = EditorPrefs.GetString (Animator.StringToHash (Application.dataPath + "uttBuildScenes").ToString ()); List parsedTestScenes = storedTestScenes.Split (',').ToList (); List parsedBuildScenes = storedBuildScenes.Split (',').ToList (); // Sanity check scenes actually exist foreach (string str in parsedTestScenes) { if (m_AllScenesInProject.Contains(str)) m_IntegrationTestScenes.Add(str); } foreach (string str in parsedBuildScenes) { if (m_AllScenesInProject.Contains(str)) m_OtherScenesToBuild.Add(str); } } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlatformRunnerSettingsWindow.cs.meta ================================================ fileFormatVersion: 2 guid: 3819282b0887bc742911b89745080acb MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlayerSettingConfigurator.cs ================================================ using System; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; namespace UnityTest { class PlayerSettingConfigurator { private string resourcesPath { get { return m_Temp ? k_TempPath : m_ProjectResourcesPath; } } private readonly string m_ProjectResourcesPath = Path.Combine("Assets", "Resources"); const string k_TempPath = "Temp"; private readonly bool m_Temp; private ResolutionDialogSetting m_DisplayResolutionDialog; private bool m_RunInBackground; private bool m_FullScreen; private bool m_ResizableWindow; private readonly List m_TempFileList = new List(); public PlayerSettingConfigurator(bool saveInTempFolder) { m_Temp = saveInTempFolder; } public void ChangeSettingsForIntegrationTests() { m_DisplayResolutionDialog = PlayerSettings.displayResolutionDialog; PlayerSettings.displayResolutionDialog = ResolutionDialogSetting.Disabled; m_RunInBackground = PlayerSettings.runInBackground; PlayerSettings.runInBackground = true; m_FullScreen = PlayerSettings.defaultIsFullScreen; PlayerSettings.defaultIsFullScreen = false; m_ResizableWindow = PlayerSettings.resizableWindow; PlayerSettings.resizableWindow = true; } public void RevertSettingsChanges() { PlayerSettings.defaultIsFullScreen = m_FullScreen; PlayerSettings.runInBackground = m_RunInBackground; PlayerSettings.displayResolutionDialog = m_DisplayResolutionDialog; PlayerSettings.resizableWindow = m_ResizableWindow; } public void AddConfigurationFile(string fileName, string content) { var resourcesPathExists = Directory.Exists(resourcesPath); if (!resourcesPathExists) AssetDatabase.CreateFolder("Assets", "Resources"); var filePath = Path.Combine(resourcesPath, fileName); File.WriteAllText(filePath, content); m_TempFileList.Add(filePath); } public void RemoveAllConfigurationFiles() { foreach (var filePath in m_TempFileList) AssetDatabase.DeleteAsset(filePath); if (Directory.Exists(resourcesPath) && Directory.GetFiles(resourcesPath).Length == 0) AssetDatabase.DeleteAsset(resourcesPath); } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner/PlayerSettingConfigurator.cs.meta ================================================ fileFormatVersion: 2 guid: c7adbe43058d54047b6109b2e66894fd MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/PlatformRunner.meta ================================================ fileFormatVersion: 2 guid: c44e9167d633ee94bb6e078238178308 DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Renderer/IntegrationTestGroupLine.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; namespace UnityTest { class IntegrationTestGroupLine : IntegrationTestRendererBase { public static List FoldMarkers; private IntegrationTestRendererBase[] m_Children; public IntegrationTestGroupLine(GameObject gameObject) : base(gameObject) { } protected internal override void DrawLine(Rect rect, GUIContent label, bool isSelected, RenderingOptions options) { EditorGUI.BeginChangeCheck(); var isClassFolded = !EditorGUI.Foldout(rect, !Folded, label, isSelected ? Styles.selectedFoldout : Styles.foldout); if (EditorGUI.EndChangeCheck()) Folded = isClassFolded; } private bool Folded { get { return FoldMarkers.Contains(m_GameObject); } set { if (value) FoldMarkers.Add(m_GameObject); else FoldMarkers.RemoveAll(s => s == m_GameObject); } } protected internal override void Render(int indend, RenderingOptions options) { base.Render(indend, options); if (!Folded) foreach (var child in m_Children) child.Render(indend + 1, options); } protected internal override TestResult.ResultType GetResult() { bool ignored = false; bool success = false; foreach (var child in m_Children) { var result = child.GetResult(); if (result == TestResult.ResultType.Failed || result == TestResult.ResultType.FailedException || result == TestResult.ResultType.Timeout) return TestResult.ResultType.Failed; if (result == TestResult.ResultType.Success) success = true; else if (result == TestResult.ResultType.Ignored) ignored = true; else ignored = false; } if (success) return TestResult.ResultType.Success; if (ignored) return TestResult.ResultType.Ignored; return TestResult.ResultType.NotRun; } protected internal override bool IsVisible(RenderingOptions options) { return m_Children.Any(c => c.IsVisible(options)); } public override bool SetCurrentTest(TestComponent tc) { m_IsRunning = false; foreach (var child in m_Children) m_IsRunning |= child.SetCurrentTest(tc); return m_IsRunning; } public void AddChildren(IntegrationTestRendererBase[] parseTestList) { m_Children = parseTestList; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Renderer/IntegrationTestGroupLine.cs.meta ================================================ fileFormatVersion: 2 guid: f6dc74195aa98ef4da8901199cda4a63 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Renderer/IntegrationTestLine.cs ================================================ using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace UnityTest { class IntegrationTestLine : IntegrationTestRendererBase { public static List Results; protected TestResult m_Result; public IntegrationTestLine(GameObject gameObject, TestResult testResult) : base(gameObject) { m_Result = testResult; } protected internal override void DrawLine(Rect rect, GUIContent label, bool isSelected, RenderingOptions options) { if(Event.current.type != EventType.repaint) return; Styles.testName.Draw (rect, label, false, false, false, isSelected); if (m_Result.IsTimeout) { float min, max; Styles.testName.CalcMinMaxWidth(label, out min, out max); var timeoutRect = new Rect(rect); timeoutRect.x += min - 12; Styles.testName.Draw(timeoutRect, s_GUITimeoutIcon, false, false, false, isSelected); } } protected internal override TestResult.ResultType GetResult() { if (!m_Result.Executed && test.ignored) return TestResult.ResultType.Ignored; return m_Result.resultType; } protected internal override bool IsVisible(RenderingOptions options) { if (!string.IsNullOrEmpty(options.nameFilter) && !m_GameObject.name.ToLower().Contains(options.nameFilter.ToLower())) return false; if (!options.showSucceeded && m_Result.IsSuccess) return false; if (!options.showFailed && m_Result.IsFailure) return false; if (!options.showNotRunned && !m_Result.Executed) return false; if (!options.showIgnored && test.ignored) return false; return true; } public override bool SetCurrentTest(TestComponent tc) { m_IsRunning = test == tc; return m_IsRunning; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Renderer/IntegrationTestLine.cs.meta ================================================ fileFormatVersion: 2 guid: 212be02e4a7da194688b08ab0c946fbd MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Renderer/IntegrationTestRendererBase.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; namespace UnityTest { public abstract class IntegrationTestRendererBase : IComparable { public static Action> RunTest; protected static bool s_Refresh; private static readonly GUIContent k_GUIRunSelected = new GUIContent("Run Selected"); private static readonly GUIContent k_GUIRun = new GUIContent("Run"); private static readonly GUIContent k_GUIDelete = new GUIContent("Delete"); private static readonly GUIContent k_GUIDeleteSelected = new GUIContent("Delete selected"); protected static GUIContent s_GUITimeoutIcon = new GUIContent(Icons.StopwatchImg, "Timeout"); protected GameObject m_GameObject; public TestComponent test; private readonly string m_Name; protected IntegrationTestRendererBase(GameObject gameObject) { test = gameObject.GetComponent(typeof(TestComponent)) as TestComponent; if (test == null) throw new ArgumentException("Provided GameObject is not a test object"); m_GameObject = gameObject; m_Name = test.Name; } public int CompareTo(IntegrationTestRendererBase other) { return test.CompareTo(other.test); } public bool Render(RenderingOptions options) { s_Refresh = false; EditorGUIUtility.SetIconSize(new Vector2(15, 15)); Render(0, options); EditorGUIUtility.SetIconSize(Vector2.zero); return s_Refresh; } protected internal virtual void Render(int indend, RenderingOptions options) { if (!IsVisible(options)) return; EditorGUILayout.BeginHorizontal(); GUILayout.Space(indend * 10); var tempColor = GUI.color; if (m_IsRunning) { var frame = Mathf.Abs(Mathf.Cos(Time.realtimeSinceStartup * 4)) * 0.6f + 0.4f; GUI.color = new Color(1, 1, 1, frame); } var isSelected = Selection.gameObjects.Contains(m_GameObject); var value = GetResult(); var icon = GetIconForResult(value); var label = new GUIContent(m_Name, icon); var labelRect = GUILayoutUtility.GetRect(label, EditorStyles.label, GUILayout.ExpandWidth(true), GUILayout.Height(18)); OnLeftMouseButtonClick(labelRect); OnContextClick(labelRect); DrawLine(labelRect, label, isSelected, options); if (m_IsRunning) GUI.color = tempColor; EditorGUILayout.EndHorizontal(); } protected void OnSelect() { if (!Event.current.control && !Event.current.command) { Selection.objects = new Object[0]; GUIUtility.keyboardControl = 0; } if ((Event.current.control || Event.current.command) && Selection.gameObjects.Contains(test.gameObject)) Selection.objects = Selection.gameObjects.Where(o => o != test.gameObject).ToArray(); else Selection.objects = Selection.gameObjects.Concat(new[] { test.gameObject }).ToArray(); } protected void OnLeftMouseButtonClick(Rect rect) { if (rect.Contains(Event.current.mousePosition) && Event.current.type == EventType.mouseDown && Event.current.button == 0) { rect.width = 20; if (rect.Contains(Event.current.mousePosition)) return; Event.current.Use(); OnSelect(); } } protected void OnContextClick(Rect rect) { if (rect.Contains(Event.current.mousePosition) && Event.current.type == EventType.ContextClick) { DrawContextMenu(test); } } public static void DrawContextMenu(TestComponent testComponent) { if (EditorApplication.isPlayingOrWillChangePlaymode) return; var selectedTests = Selection.gameObjects.Where(go => go.GetComponent(typeof(TestComponent))); var manySelected = selectedTests.Count() > 1; var m = new GenericMenu(); if (manySelected) { // var testsToRun m.AddItem(k_GUIRunSelected, false, data => RunTest(selectedTests.Select(o => o.GetComponent(typeof(TestComponent))).Cast().ToList()), null); } m.AddItem(k_GUIRun, false, data => RunTest(new[] { testComponent }), null); m.AddSeparator(""); m.AddItem(manySelected ? k_GUIDeleteSelected : k_GUIDelete, false, data => RemoveTests(selectedTests.ToArray()), null); m.ShowAsContext(); } private static void RemoveTests(GameObject[] testsToDelete) { foreach (var t in testsToDelete) { Undo.DestroyObjectImmediate(t); } } public static Texture GetIconForResult(TestResult.ResultType resultState) { switch (resultState) { case TestResult.ResultType.Success: return Icons.SuccessImg; case TestResult.ResultType.Timeout: case TestResult.ResultType.Failed: case TestResult.ResultType.FailedException: return Icons.FailImg; case TestResult.ResultType.Ignored: return Icons.IgnoreImg; default: return Icons.UnknownImg; } } protected internal bool m_IsRunning; protected internal abstract void DrawLine(Rect rect, GUIContent label, bool isSelected, RenderingOptions options); protected internal abstract TestResult.ResultType GetResult(); protected internal abstract bool IsVisible(RenderingOptions options); public abstract bool SetCurrentTest(TestComponent tc); } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Renderer/IntegrationTestRendererBase.cs.meta ================================================ fileFormatVersion: 2 guid: 604645a3b57179a4d873906b625ef8ec MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Renderer/RenderingOptions.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; namespace UnityTest { public class RenderingOptions { public string nameFilter; public bool showSucceeded; public bool showFailed; public bool showIgnored; public bool showNotRunned; public string[] categories; } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Renderer/RenderingOptions.cs.meta ================================================ fileFormatVersion: 2 guid: 5c0aec4b4a6d1b047a98e8cc213e1a36 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/Renderer.meta ================================================ fileFormatVersion: 2 guid: 5944b82e46f1682439d20b4c3a4f029c DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/TestComponentEditor.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; using UnityEditor.SceneManagement; namespace UnityTest { [CanEditMultipleObjects] [CustomEditor(typeof(TestComponent))] public class TestComponentEditor : Editor { private SerializedProperty m_ExpectException; private SerializedProperty m_ExpectedExceptionList; private SerializedProperty m_Ignored; private SerializedProperty m_SucceedAssertions; private SerializedProperty m_SucceedWhenExceptionIsThrown; private SerializedProperty m_Timeout; #region GUI Contens private readonly GUIContent m_GUIExpectException = new GUIContent("Expect exception", "Should the test expect an exception"); private readonly GUIContent m_GUIExpectExceptionList = new GUIContent("Expected exception list", "A comma separated list of exception types which will not fail the test when thrown"); private readonly GUIContent m_GUIIgnore = new GUIContent("Ignore", "Ignore the tests in runs"); private readonly GUIContent m_GUIIncludePlatforms = new GUIContent("Included platforms", "Platform on which the test should run"); private readonly GUIContent m_GUISuccedOnAssertions = new GUIContent("Succeed on assertions", "Succeed after all assertions are executed"); private readonly GUIContent m_GUISucceedWhenExceptionIsThrown = new GUIContent("Succeed when exception is thrown", "Should the test succeed when an expected exception is thrown"); private readonly GUIContent m_GUITestName = new GUIContent("Test name", "Name of the test (is equal to the GameObject name)"); private readonly GUIContent m_GUITimeout = new GUIContent("Timeout", "Number of seconds after which the test will timeout"); #endregion public void OnEnable() { m_Timeout = serializedObject.FindProperty("timeout"); m_Ignored = serializedObject.FindProperty("ignored"); m_SucceedAssertions = serializedObject.FindProperty("succeedAfterAllAssertionsAreExecuted"); m_ExpectException = serializedObject.FindProperty("expectException"); m_ExpectedExceptionList = serializedObject.FindProperty("expectedExceptionList"); m_SucceedWhenExceptionIsThrown = serializedObject.FindProperty("succeedWhenExceptionIsThrown"); } public override void OnInspectorGUI() { var component = (TestComponent)target; if (component.dynamic) { if(GUILayout.Button("Reload dynamic tests")) { TestComponent.DestroyAllDynamicTests(); Selection.objects = new Object[0]; IntegrationTestsRunnerWindow.selectedInHierarchy = false; GUIUtility.ExitGUI(); return; } EditorGUILayout.HelpBox("This is a test generated from code. No changes in the component will be persisted.", MessageType.Info); } if (component.IsTestGroup()) { EditorGUI.BeginChangeCheck(); var newGroupName = EditorGUILayout.TextField(m_GUITestName, component.name); if (EditorGUI.EndChangeCheck()) component.name = newGroupName; serializedObject.ApplyModifiedProperties(); return; } serializedObject.Update(); EditorGUI.BeginDisabledGroup(serializedObject.isEditingMultipleObjects); EditorGUI.BeginChangeCheck(); var newName = EditorGUILayout.TextField(m_GUITestName, component.name); if (EditorGUI.EndChangeCheck()) component.name = newName; if (component.platformsToIgnore == null) { component.platformsToIgnore = GetListOfIgnoredPlatforms(Enum.GetNames(typeof(TestComponent.IncludedPlatforms)), (int)component.includedPlatforms); } var enumList = Enum.GetNames(typeof(RuntimePlatform)); var flags = GetFlagList(enumList, component.platformsToIgnore); flags = EditorGUILayout.MaskField(m_GUIIncludePlatforms, flags, enumList, EditorStyles.popup); var newList = GetListOfIgnoredPlatforms(enumList, flags); if (!component.dynamic) component.platformsToIgnore = newList; EditorGUI.EndDisabledGroup(); EditorGUILayout.PropertyField(m_Timeout, m_GUITimeout); EditorGUILayout.PropertyField(m_Ignored, m_GUIIgnore); EditorGUILayout.PropertyField(m_SucceedAssertions, m_GUISuccedOnAssertions); EditorGUILayout.PropertyField(m_ExpectException, m_GUIExpectException); EditorGUI.BeginDisabledGroup(!m_ExpectException.boolValue); EditorGUILayout.PropertyField(m_ExpectedExceptionList, m_GUIExpectExceptionList); EditorGUILayout.PropertyField(m_SucceedWhenExceptionIsThrown, m_GUISucceedWhenExceptionIsThrown); EditorGUI.EndDisabledGroup(); if (!component.dynamic) serializedObject.ApplyModifiedProperties(); if (GUI.changed) EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); } private string[] GetListOfIgnoredPlatforms(string[] enumList, int flags) { var notSelectedPlatforms = new List(); for (int i = 0; i < enumList.Length; i++) { var sel = (flags & (1 << i)) != 0; if (!sel) notSelectedPlatforms.Add(enumList[i]); } return notSelectedPlatforms.ToArray(); } private int GetFlagList(string[] enumList, string[] platformsToIgnore) { int flags = ~0; for (int i = 0; i < enumList.Length; i++) if (platformsToIgnore != null && platformsToIgnore.Any(s => s == enumList[i])) flags &= ~(1 << i); return flags; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor/TestComponentEditor.cs.meta ================================================ fileFormatVersion: 2 guid: 160889f21f4d5944b9f6fcaf9c33f684 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/Editor.meta ================================================ fileFormatVersion: 2 guid: caee08596a5965747b8edfde19e2f873 folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/ITestRunnerCallback.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; namespace UnityTest.IntegrationTestRunner { public interface ITestRunnerCallback { void RunStarted(string platform, List testsToRun); void RunFinished(List testResults); void AllScenesFinished(); void TestStarted(TestResult test); void TestFinished(TestResult test); void TestRunInterrupted(List testsNotRun); } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/ITestRunnerCallback.cs.meta ================================================ fileFormatVersion: 2 guid: 35af7d395e501a348ae1a0aa3c91dee4 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/IntegrationTest.cs ================================================ using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEngine; public static class IntegrationTest { public const string passMessage = "IntegrationTest Pass"; public const string failMessage = "IntegrationTest Fail"; public static void Pass() { LogResult(passMessage); } public static void Pass(GameObject go) { LogResult(go, passMessage); } public static void Fail(string reason) { Fail(); if (!string.IsNullOrEmpty(reason)) Debug.Log(reason); } public static void Fail(GameObject go, string reason) { Fail(go); if (!string.IsNullOrEmpty(reason)) Debug.Log(reason); } public static void Fail() { LogResult(failMessage); } public static void Fail(GameObject go) { LogResult(go, failMessage); } public static void Assert(bool condition) { Assert(condition, ""); } public static void Assert(GameObject go, bool condition) { Assert(go, condition, ""); } public static void Assert(bool condition, string message) { if (!condition) Fail(message); } public static void Assert(GameObject go, bool condition, string message) { if (!condition) Fail(go, message); } private static void LogResult(string message) { Debug.Log(message); } private static void LogResult(GameObject go, string message) { Debug.Log(message + " (" + FindTestObject(go).name + ")", go); } private static GameObject FindTestObject(GameObject go) { var temp = go; while (temp.transform.parent != null) { if (temp.GetComponent("TestComponent") != null) return temp; temp = temp.transform.parent.gameObject; } return go; } #region Dynamic test attributes [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class ExcludePlatformAttribute : Attribute { public string[] platformsToExclude; public ExcludePlatformAttribute(params RuntimePlatform[] platformsToExclude) { this.platformsToExclude = platformsToExclude.Select(platform => platform.ToString()).ToArray(); } } [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class ExpectExceptions : Attribute { public string[] exceptionTypeNames; public bool succeedOnException; public ExpectExceptions() : this(false) { } public ExpectExceptions(bool succeedOnException) : this(succeedOnException, new string[0]) { } public ExpectExceptions(bool succeedOnException, params string[] exceptionTypeNames) { this.succeedOnException = succeedOnException; this.exceptionTypeNames = exceptionTypeNames; } public ExpectExceptions(bool succeedOnException, params Type[] exceptionTypes) : this(succeedOnException, exceptionTypes.Select(type => type.FullName).ToArray()) { } public ExpectExceptions(params string[] exceptionTypeNames) : this(false, exceptionTypeNames) { } public ExpectExceptions(params Type[] exceptionTypes) : this(false, exceptionTypes) { } } [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class IgnoreAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class DynamicTestAttribute : Attribute { private readonly string m_SceneName; public DynamicTestAttribute(string sceneName) { if (sceneName.EndsWith(".unity")) sceneName = sceneName.Substring(0, sceneName.Length - ".unity".Length); m_SceneName = sceneName; } public bool IncludeOnScene(string sceneName) { var fileName = Path.GetFileNameWithoutExtension(sceneName); return fileName == m_SceneName; } } [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class SucceedWithAssertions : Attribute { } [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class TimeoutAttribute : Attribute { public float timeout; public TimeoutAttribute(float seconds) { timeout = seconds; } } #endregion } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/IntegrationTest.cs.meta ================================================ fileFormatVersion: 2 guid: eb367bbc76e489443a4ebc8b0a8642f4 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/IntegrationTestAttribute.cs ================================================ using System; using System.Collections.Generic; using System.IO; using UnityEngine; [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class IntegrationTestAttribute : Attribute { private readonly string m_Path; public IntegrationTestAttribute(string path) { if (path.EndsWith(".unity")) path = path.Substring(0, path.Length - ".unity".Length); m_Path = path; } public bool IncludeOnScene(string scenePath) { if (scenePath == m_Path) return true; var fileName = Path.GetFileNameWithoutExtension(scenePath); return fileName == m_Path; } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/IntegrationTestAttribute.cs.meta ================================================ fileFormatVersion: 2 guid: f1a5c61a06ed66e41a6ee1b5f88b5afd MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/IntegrationTestsProvider.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace UnityTest.IntegrationTestRunner { class IntegrationTestsProvider { internal Dictionary> testCollection = new Dictionary>(); internal ITestComponent currentTestGroup; internal IEnumerable testToRun; public IntegrationTestsProvider(IEnumerable tests) { testToRun = tests; foreach (var test in tests.OrderBy(component => component)) { if (test.IsTestGroup()) { throw new Exception(test.Name + " is test a group"); } AddTestToList(test); } if (currentTestGroup == null) { currentTestGroup = FindInnerTestGroup(TestComponent.NullTestComponent); } } private void AddTestToList(ITestComponent test) { var group = test.GetTestGroup(); if (!testCollection.ContainsKey(group)) testCollection.Add(group, new HashSet()); testCollection[group].Add(test); if (group == TestComponent.NullTestComponent) return; AddTestToList(group); } public ITestComponent GetNextTest() { var test = testCollection[currentTestGroup].First(); testCollection[currentTestGroup].Remove(test); test.EnableTest(true); return test; } public void FinishTest(ITestComponent test) { try { test.EnableTest(false); currentTestGroup = FindNextTestGroup(currentTestGroup); } catch (MissingReferenceException e) { Debug.LogException(e); } } private ITestComponent FindNextTestGroup(ITestComponent testGroup) { if (testGroup == null) throw new Exception ("No test left"); if (testCollection[testGroup].Any()) { testGroup.EnableTest(true); return FindInnerTestGroup(testGroup); } testCollection.Remove(testGroup); testGroup.EnableTest(false); var parentTestGroup = testGroup.GetTestGroup(); if (parentTestGroup == null) return null; testCollection[parentTestGroup].Remove(testGroup); return FindNextTestGroup(parentTestGroup); } private ITestComponent FindInnerTestGroup(ITestComponent group) { var innerGroups = testCollection[group]; foreach (var innerGroup in innerGroups) { if (!innerGroup.IsTestGroup()) continue; innerGroup.EnableTest(true); return FindInnerTestGroup(innerGroup); } return group; } public bool AnyTestsLeft() { return testCollection.Count != 0; } public List GetRemainingTests() { var remainingTests = new List(); foreach (var test in testCollection) { remainingTests.AddRange(test.Value); } return remainingTests; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/IntegrationTestsProvider.cs.meta ================================================ fileFormatVersion: 2 guid: 21d32637b19ee51489062a66ad922193 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/NetworkResultSender.cs ================================================ #if !UNITY_METRO && (UNITY_PRO_LICENSE || !(UNITY_ANDROID || UNITY_IPHONE)) #define UTT_SOCKETS_SUPPORTED #endif using System; using System.Collections.Generic; using UnityEngine; using UnityTest.IntegrationTestRunner; #if UTT_SOCKETS_SUPPORTED using System.Net.Sockets; using System.Runtime.Serialization.Formatters.Binary; #endif namespace UnityTest { public class NetworkResultSender : ITestRunnerCallback { #if UTT_SOCKETS_SUPPORTED private readonly TimeSpan m_ConnectionTimeout = TimeSpan.FromSeconds(5); private readonly string m_Ip; private readonly int m_Port; #endif private bool m_LostConnection; public NetworkResultSender(string ip, int port) { #if UTT_SOCKETS_SUPPORTED m_Ip = ip; m_Port = port; #endif } private bool SendDTO(ResultDTO dto) { if (m_LostConnection) return false; #if UTT_SOCKETS_SUPPORTED try { using (var tcpClient = new TcpClient()) { var result = tcpClient.BeginConnect(m_Ip, m_Port, null, null); var success = result.AsyncWaitHandle.WaitOne(m_ConnectionTimeout); if (!success) { return false; } try { tcpClient.EndConnect(result); } catch (SocketException) { m_LostConnection = true; return false; } var bf = new DTOFormatter(); bf.Serialize(tcpClient.GetStream(), dto); tcpClient.GetStream().Close(); tcpClient.Close(); Debug.Log("Sent " + dto.messageType); } } catch (SocketException e) { Debug.LogException(e); m_LostConnection = true; return false; } #endif // if UTT_SOCKETS_SUPPORTED return true; } public bool Ping() { var result = SendDTO(ResultDTO.CreatePing()); m_LostConnection = false; return result; } public void RunStarted(string platform, List testsToRun) { SendDTO(ResultDTO.CreateRunStarted()); } public void RunFinished(List testResults) { SendDTO(ResultDTO.CreateRunFinished(testResults)); } public void TestStarted(TestResult test) { SendDTO(ResultDTO.CreateTestStarted(test)); } public void TestFinished(TestResult test) { SendDTO(ResultDTO.CreateTestFinished(test)); } public void AllScenesFinished() { SendDTO (ResultDTO.CreateAllScenesFinished ()); } public void TestRunInterrupted(List testsNotRun) { RunFinished(new List()); } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/NetworkResultSender.cs.meta ================================================ fileFormatVersion: 2 guid: 80b91644bbbc487479429368d4e8d596 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/ResultDTO.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; namespace UnityTest { [Serializable] public class ResultDTO { public MessageType messageType; public int levelCount; public int loadedLevel; public string loadedLevelName; public string testName; public float testTimeout; public ITestResult testResult; private ResultDTO(MessageType messageType) { this.messageType = messageType; levelCount = UnityEngine.SceneManagement.SceneManager.sceneCount; loadedLevel = UnityEngine.SceneManagement.SceneManager.GetActiveScene().buildIndex; loadedLevelName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name; } public enum MessageType : byte { Ping, RunStarted, RunFinished, TestStarted, TestFinished, RunInterrupted, AllScenesFinished } public static ResultDTO CreatePing() { var dto = new ResultDTO(MessageType.Ping); return dto; } public static ResultDTO CreateRunStarted() { var dto = new ResultDTO(MessageType.RunStarted); return dto; } public static ResultDTO CreateRunFinished(List testResults) { var dto = new ResultDTO(MessageType.RunFinished); return dto; } public static ResultDTO CreateTestStarted(TestResult test) { var dto = new ResultDTO(MessageType.TestStarted); dto.testName = test.FullName; dto.testTimeout = test.TestComponent.timeout; return dto; } public static ResultDTO CreateTestFinished(TestResult test) { var dto = new ResultDTO(MessageType.TestFinished); dto.testName = test.FullName; dto.testResult = GetSerializableTestResult(test); return dto; } public static ResultDTO CreateAllScenesFinished() { var dto = new ResultDTO(MessageType.AllScenesFinished); return dto; } private static ITestResult GetSerializableTestResult(TestResult test) { var str = new SerializableTestResult(); str.resultState = test.ResultState; str.message = test.messages; str.executed = test.Executed; str.name = test.Name; str.fullName = test.FullName; str.id = test.id; str.isSuccess = test.IsSuccess; str.duration = test.duration; str.stackTrace = test.stacktrace; str.isIgnored = test.IsIgnored; return str; } } #region SerializableTestResult [Serializable] internal class SerializableTestResult : ITestResult { public TestResultState resultState; public string message; public bool executed; public string name; public string fullName; public string id; public bool isSuccess; public double duration; public string stackTrace; public bool isIgnored; public TestResultState ResultState { get { return resultState; } } public string Message { get { return message; } } public string Logs { get { return null; } } public bool Executed { get { return executed; } } public string Name { get { return name; } } public string FullName { get { return fullName; } } public string Id { get { return id; } } public bool IsSuccess { get { return isSuccess; } } public double Duration { get { return duration; } } public string StackTrace { get { return stackTrace; } } public bool IsIgnored { get { return isIgnored; } } } #endregion } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/ResultDTO.cs.meta ================================================ fileFormatVersion: 2 guid: 37c772b6d1ba4274aa96c83710cb27e8 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestComponent.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEngine; using UnityEngine.SceneManagement; #if UNITY_EDITOR using UnityEditor; #endif namespace UnityTest { public interface ITestComponent : IComparable { void EnableTest(bool enable); bool IsTestGroup(); GameObject gameObject { get; } string Name { get; } ITestComponent GetTestGroup(); bool IsExceptionExpected(string exceptionType); bool ShouldSucceedOnException(); double GetTimeout(); bool IsIgnored(); bool ShouldSucceedOnAssertions(); bool IsExludedOnThisPlatform(); } public class TestComponent : MonoBehaviour, ITestComponent { public static ITestComponent NullTestComponent = new NullTestComponentImpl(); public float timeout = 5; public bool ignored = false; public bool succeedAfterAllAssertionsAreExecuted = false; public bool expectException = false; public string expectedExceptionList = ""; public bool succeedWhenExceptionIsThrown = false; public IncludedPlatforms includedPlatforms = (IncludedPlatforms) ~0L; public string[] platformsToIgnore = null; public bool dynamic; public string dynamicTypeName; public bool IsExludedOnThisPlatform() { return platformsToIgnore != null && platformsToIgnore.Any(platform => platform == Application.platform.ToString()); } static bool IsAssignableFrom(Type a, Type b) { #if !UNITY_METRO return a.IsAssignableFrom(b); #else return false; #endif } public bool IsExceptionExpected(string exception) { exception = exception.Trim(); if (!expectException) return false; if(string.IsNullOrEmpty(expectedExceptionList.Trim())) return true; foreach (var expectedException in expectedExceptionList.Split(',').Select(e => e.Trim())) { if (exception == expectedException) return true; var exceptionType = Type.GetType(exception) ?? GetTypeByName(exception); var expectedExceptionType = Type.GetType(expectedException) ?? GetTypeByName(expectedException); if (exceptionType != null && expectedExceptionType != null && IsAssignableFrom(expectedExceptionType, exceptionType)) return true; } return false; } public bool ShouldSucceedOnException() { return succeedWhenExceptionIsThrown; } public double GetTimeout() { return timeout; } public bool IsIgnored() { return ignored; } public bool ShouldSucceedOnAssertions() { return succeedAfterAllAssertionsAreExecuted; } private static Type GetTypeByName(string className) { #if !UNITY_METRO return AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).FirstOrDefault(type => type.Name == className); #else return null; #endif } public void OnValidate() { if (timeout < 0.01f) timeout = 0.01f; } // Legacy [Flags] public enum IncludedPlatforms { WindowsEditor = 1 << 0, OSXEditor = 1 << 1, WindowsPlayer = 1 << 2, OSXPlayer = 1 << 3, LinuxPlayer = 1 << 4, MetroPlayerX86 = 1 << 5, MetroPlayerX64 = 1 << 6, MetroPlayerARM = 1 << 7, WindowsWebPlayer = 1 << 8, OSXWebPlayer = 1 << 9, Android = 1 << 10, // ReSharper disable once InconsistentNaming IPhonePlayer = 1 << 11, TizenPlayer = 1 << 12, WP8Player = 1 << 13, BB10Player = 1 << 14, NaCl = 1 << 15, PS3 = 1 << 16, XBOX360 = 1 << 17, WiiPlayer = 1 << 18, PSP2 = 1 << 19, PS4 = 1 << 20, PSMPlayer = 1 << 21, XboxOne = 1 << 22, } #region ITestComponent implementation public void EnableTest(bool enable) { if (enable && dynamic) { Type t = Type.GetType(dynamicTypeName); var s = gameObject.GetComponent(t) as MonoBehaviour; if (s != null) DestroyImmediate(s); gameObject.AddComponent(t); } if (gameObject.activeSelf != enable) gameObject.SetActive(enable); } public int CompareTo(ITestComponent obj) { if (obj == NullTestComponent) return 1; var result = gameObject.name.CompareTo(obj.gameObject.name); if (result == 0) result = gameObject.GetInstanceID().CompareTo(obj.gameObject.GetInstanceID()); return result; } public bool IsTestGroup() { for (int i = 0; i < gameObject.transform.childCount; i++) { var childTc = gameObject.transform.GetChild(i).GetComponent(typeof(TestComponent)); if (childTc != null) return true; } return false; } public string Name { get { return gameObject == null ? "" : gameObject.name; } } public ITestComponent GetTestGroup() { var parent = gameObject.transform.parent; if (parent == null) return NullTestComponent; return parent.GetComponent(); } public override bool Equals(object o) { if (o is TestComponent) return this == (o as TestComponent); return false; } public override int GetHashCode() { return base.GetHashCode(); } public static bool operator ==(TestComponent a, TestComponent b) { if (ReferenceEquals(a, b)) return true; if (((object)a == null) || ((object)b == null)) return false; if (a.dynamic && b.dynamic) return a.dynamicTypeName == b.dynamicTypeName; if (a.dynamic || b.dynamic) return false; return a.gameObject == b.gameObject; } public static bool operator !=(TestComponent a, TestComponent b) { return !(a == b); } #endregion #region Static helpers public static TestComponent CreateDynamicTest(Type type) { var go = CreateTest(type.Name); go.hideFlags |= HideFlags.DontSave; go.SetActive(false); var tc = go.GetComponent(); tc.dynamic = true; tc.dynamicTypeName = type.AssemblyQualifiedName; #if !UNITY_METRO foreach (var typeAttribute in type.GetCustomAttributes(false)) { if (typeAttribute is IntegrationTest.TimeoutAttribute) tc.timeout = (typeAttribute as IntegrationTest.TimeoutAttribute).timeout; else if (typeAttribute is IntegrationTest.IgnoreAttribute) tc.ignored = true; else if (typeAttribute is IntegrationTest.SucceedWithAssertions) tc.succeedAfterAllAssertionsAreExecuted = true; else if (typeAttribute is IntegrationTest.ExcludePlatformAttribute) tc.platformsToIgnore = (typeAttribute as IntegrationTest.ExcludePlatformAttribute).platformsToExclude; else if (typeAttribute is IntegrationTest.ExpectExceptions) { var attribute = (typeAttribute as IntegrationTest.ExpectExceptions); tc.expectException = true; tc.expectedExceptionList = string.Join(",", attribute.exceptionTypeNames); tc.succeedWhenExceptionIsThrown = attribute.succeedOnException; } } go.AddComponent(type); #endif // if !UNITY_METRO return tc; } public static GameObject CreateTest() { return CreateTest("New Test"); } private static GameObject CreateTest(string name) { var go = new GameObject(name); go.AddComponent(); #if UNITY_EDITOR Undo.RegisterCreatedObjectUndo(go, "Created test"); #endif return go; } public static List FindAllTestsOnScene() { var tests = Resources.FindObjectsOfTypeAll (typeof(TestComponent)).Cast (); #if UNITY_EDITOR tests = tests.Where( t => {var p = PrefabUtility.GetPrefabType(t); return p != PrefabType.Prefab && p != PrefabType.ModelPrefab;} ); #endif return tests.ToList (); } public static List FindAllTopTestsOnScene() { return FindAllTestsOnScene().Where(component => component.gameObject.transform.parent == null).ToList(); } public static List FindAllDynamicTestsOnScene() { return FindAllTestsOnScene().Where(t => t.dynamic).ToList(); } public static void DestroyAllDynamicTests() { foreach (var dynamicTestComponent in FindAllDynamicTestsOnScene()) DestroyImmediate(dynamicTestComponent.gameObject); } public static void DisableAllTests() { foreach (var t in FindAllTestsOnScene()) t.EnableTest(false); } public static bool AnyTestsOnScene() { return FindAllTestsOnScene().Any(); } public static bool AnyDynamicTestForCurrentScene() { #if UNITY_EDITOR return TestComponent.GetTypesWithHelpAttribute(SceneManager.GetActiveScene().name).Any(); #else return TestComponent.GetTypesWithHelpAttribute(SceneManager.GetActiveScene().name).Any(); #endif } #endregion private sealed class NullTestComponentImpl : ITestComponent { public int CompareTo(ITestComponent other) { if (other == this) return 0; return -1; } public void EnableTest(bool enable) { } public bool IsTestGroup() { throw new NotImplementedException(); } public GameObject gameObject { get; private set; } public string Name { get { return ""; } } public ITestComponent GetTestGroup() { return null; } public bool IsExceptionExpected(string exceptionType) { throw new NotImplementedException(); } public bool ShouldSucceedOnException() { throw new NotImplementedException(); } public double GetTimeout() { throw new NotImplementedException(); } public bool IsIgnored() { throw new NotImplementedException(); } public bool ShouldSucceedOnAssertions() { throw new NotImplementedException(); } public bool IsExludedOnThisPlatform() { throw new NotImplementedException(); } } public static IEnumerable GetTypesWithHelpAttribute(string sceneName) { #if !UNITY_METRO foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { Type[] types = null; try { types = assembly.GetTypes(); } catch (ReflectionTypeLoadException ex) { Debug.LogError("Failed to load types from: " + assembly.FullName); foreach (Exception loadEx in ex.LoaderExceptions) Debug.LogException(loadEx); } if (types == null) continue; foreach (Type type in types) { var attributes = type.GetCustomAttributes(typeof(IntegrationTest.DynamicTestAttribute), true); if (attributes.Length == 1) { var a = attributes.Single() as IntegrationTest.DynamicTestAttribute; if (a.IncludeOnScene(sceneName)) yield return type; } } } #else // if !UNITY_METRO yield break; #endif // if !UNITY_METRO } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestComponent.cs.meta ================================================ fileFormatVersion: 2 guid: b1dba0b27b0864740a8720e920aa88c0 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestResult.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; namespace UnityTest { [Serializable] public class TestResult : ITestResult, IComparable { private readonly GameObject m_Go; private string m_Name; public ResultType resultType = ResultType.NotRun; public double duration; public string messages; public string stacktrace; public string id; public bool dynamicTest; public TestComponent TestComponent; public GameObject GameObject { get { return m_Go; } } public TestResult(TestComponent testComponent) { TestComponent = testComponent; m_Go = testComponent.gameObject; id = testComponent.gameObject.GetInstanceID().ToString(); dynamicTest = testComponent.dynamic; if (m_Go != null) m_Name = m_Go.name; if (dynamicTest) id = testComponent.dynamicTypeName; } public void Update(TestResult oldResult) { resultType = oldResult.resultType; duration = oldResult.duration; messages = oldResult.messages; stacktrace = oldResult.stacktrace; } public enum ResultType { Success, Failed, Timeout, NotRun, FailedException, Ignored } public void Reset() { resultType = ResultType.NotRun; duration = 0f; messages = ""; stacktrace = ""; } #region ITestResult implementation public TestResultState ResultState { get { switch (resultType) { case ResultType.Success: return TestResultState.Success; case ResultType.Failed: return TestResultState.Failure; case ResultType.FailedException: return TestResultState.Error; case ResultType.Ignored: return TestResultState.Ignored; case ResultType.NotRun: return TestResultState.Skipped; case ResultType.Timeout: return TestResultState.Cancelled; default: throw new Exception(); } } } public string Message { get { return messages; } } public string Logs { get { return null; } } public bool Executed { get { return resultType != ResultType.NotRun; } } public string Name { get { if (m_Go != null) m_Name = m_Go.name; return m_Name; } } public string Id { get { return id; } } public bool IsSuccess { get { return resultType == ResultType.Success; } } public bool IsTimeout { get { return resultType == ResultType.Timeout; } } public double Duration { get { return duration; } } public string StackTrace { get { return stacktrace; } } public string FullName { get { var fullName = Name; if (m_Go != null) { var tempGo = m_Go.transform.parent; while (tempGo != null) { fullName = tempGo.name + "." + fullName; tempGo = tempGo.transform.parent; } } return fullName; } } public bool IsIgnored { get { return resultType == ResultType.Ignored; } } public bool IsFailure { get { return resultType == ResultType.Failed || resultType == ResultType.FailedException || resultType == ResultType.Timeout; } } #endregion #region IComparable, GetHashCode and Equals implementation public override int GetHashCode() { return id.GetHashCode(); } public int CompareTo(TestResult other) { var result = Name.CompareTo(other.Name); if (result == 0) result = m_Go.GetInstanceID().CompareTo(other.m_Go.GetInstanceID()); return result; } public override bool Equals(object obj) { if (obj is TestResult) return GetHashCode() == obj.GetHashCode(); return base.Equals(obj); } #endregion } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestResult.cs.meta ================================================ fileFormatVersion: 2 guid: 68740a702763aaa4594e8319a05ae0d3 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestResultRenderer.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using UnityEngine; public 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 Dictionary> m_TestCollection = new Dictionary>(); private bool m_ShowResults; Vector2 m_ScrollPosition; private int m_FailureCount; public void ShowResults() { m_ShowResults = true; Cursor.visible = true; } public void AddResults(string sceneName, ITestResult result) { if (!m_TestCollection.ContainsKey(sceneName)) m_TestCollection.Add(sceneName, new List()); m_TestCollection[sceneName].Add(result); if (result.Executed && !result.IsSuccess) m_FailureCount++; } public void Draw() { if (!m_ShowResults) return; if (m_TestCollection.Count == 0) { GUILayout.Label("All test succeeded", Styles.SucceedLabelStyle, GUILayout.Width(600)); } else { int count = m_TestCollection.Sum (testGroup => testGroup.Value.Count); GUILayout.Label(count + " tests failed!", Styles.FailedLabelStyle); m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition, GUILayout.ExpandWidth(true)); var text = ""; foreach (var testGroup in m_TestCollection) { text += "" + testGroup.Key + "\n"; text += string.Join("\n", testGroup.Value .Where(result => !result.IsSuccess) .Select(result => result.Name + " " + result.ResultState + "\n" + result.Message) .ToArray()); } GUILayout.TextArea(text, Styles.FailedMessagesStyle); GUILayout.EndScrollView(); } if (GUILayout.Button("Close")) Application.Quit(); } public int FailureCount() { return m_FailureCount; } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestResultRenderer.cs.meta ================================================ fileFormatVersion: 2 guid: 7ae9d3b4b57cae343b7ff360f9deb628 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestRunner.cs ================================================ // #define IMITATE_BATCH_MODE //uncomment if you want to imitate batch mode behaviour in non-batch mode mode run using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEngine; using UnityTest.IntegrationTestRunner; using System.IO; using UnityEngine.SceneManagement; namespace UnityTest { [Serializable] public class TestRunner : MonoBehaviour { static private int TestSceneNumber = 0; static private readonly TestResultRenderer k_ResultRenderer = new TestResultRenderer(); public TestComponent currentTest; private List m_ResultList = new List(); private List m_TestComponents; public bool isInitializedByRunner { get { #if !IMITATE_BATCH_MODE if (Application.isEditor && !IsBatchMode()) return true; #endif return false; } } private double m_StartTime; private bool m_ReadyToRun; private string m_TestMessages; private string m_Stacktrace; private TestState m_TestState = TestState.Running; private TestRunnerConfigurator m_Configurator; public TestRunnerCallbackList TestRunnerCallback = new TestRunnerCallbackList(); private IntegrationTestsProvider m_TestsProvider; private const string k_Prefix = "IntegrationTest"; private const string k_StartedMessage = k_Prefix + " Started"; private const string k_FinishedMessage = k_Prefix + " Finished"; private const string k_TimeoutMessage = k_Prefix + " Timeout"; private const string k_FailedMessage = k_Prefix + " Failed"; private const string k_FailedExceptionMessage = k_Prefix + " Failed with exception"; private const string k_IgnoredMessage = k_Prefix + " Ignored"; private const string k_InterruptedMessage = k_Prefix + " Run interrupted"; public void Awake() { m_Configurator = new TestRunnerConfigurator(); if (isInitializedByRunner) return; TestComponent.DisableAllTests(); } public void Start() { if (isInitializedByRunner) return; if (m_Configurator.sendResultsOverNetwork) { var nrs = m_Configurator.ResolveNetworkConnection(); if (nrs != null) TestRunnerCallback.Add(nrs); } TestComponent.DestroyAllDynamicTests(); var dynamicTestTypes = TestComponent.GetTypesWithHelpAttribute(SceneManager.GetActiveScene().name); foreach (var dynamicTestType in dynamicTestTypes) TestComponent.CreateDynamicTest(dynamicTestType); var tests = TestComponent.FindAllTestsOnScene(); InitRunner(tests, dynamicTestTypes.Select(type => type.AssemblyQualifiedName).ToList()); } public void InitRunner(List tests, List dynamicTestsToRun) { Application.logMessageReceived += LogHandler; // Init dynamic tests foreach (var typeName in dynamicTestsToRun) { var t = Type.GetType(typeName); if (t == null) continue; var scriptComponents = Resources.FindObjectsOfTypeAll(t) as MonoBehaviour[]; if (scriptComponents.Length == 0) { Debug.LogWarning(t + " not found. Skipping."); continue; } if (scriptComponents.Length > 1) Debug.LogWarning("Multiple GameObjects refer to " + typeName); tests.Add(scriptComponents.First().GetComponent()); } // create test structure m_TestComponents = ParseListForGroups(tests).ToList(); // create results for tests m_ResultList = m_TestComponents.Select(component => new TestResult(component)).ToList(); // init test provider m_TestsProvider = new IntegrationTestsProvider(m_ResultList.Select(result => result.TestComponent as ITestComponent)); m_ReadyToRun = true; } private static IEnumerable ParseListForGroups(IEnumerable tests) { var results = new HashSet(); foreach (var testResult in tests) { if (testResult.IsTestGroup()) { var childrenTestResult = testResult.gameObject.GetComponentsInChildren(typeof(TestComponent), true) .Where(t => t != testResult) .Cast() .ToArray(); foreach (var result in childrenTestResult) { if (!result.IsTestGroup()) results.Add(result); } continue; } results.Add(testResult); } return results; } public void Update() { if (m_ReadyToRun && Time.frameCount > 1) { m_ReadyToRun = false; StartCoroutine("StateMachine"); } } public void OnDestroy() { if (currentTest != null) { var testResult = m_ResultList.Single(result => result.TestComponent == currentTest); testResult.messages += "Test run interrupted (crash?)"; LogMessage(k_InterruptedMessage); FinishTest(TestResult.ResultType.Failed); } if (currentTest != null || (m_TestsProvider != null && m_TestsProvider.AnyTestsLeft())) { var remainingTests = m_TestsProvider.GetRemainingTests(); TestRunnerCallback.TestRunInterrupted(remainingTests.ToList()); } Application.logMessageReceived -= LogHandler; } private void LogHandler(string condition, string stacktrace, LogType type) { if (!condition.StartsWith(k_StartedMessage) && !condition.StartsWith(k_FinishedMessage)) { var msg = condition; if (msg.StartsWith(k_Prefix)) msg = msg.Substring(k_Prefix.Length + 1); if (currentTest != null && msg.EndsWith("(" + currentTest.name + ')')) msg = msg.Substring(0, msg.LastIndexOf('(')); m_TestMessages += msg + "\n"; } switch (type) { case LogType.Exception: { var exceptionType = condition.Substring(0, condition.IndexOf(':')); if (currentTest != null && currentTest.IsExceptionExpected(exceptionType)) { m_TestMessages += exceptionType + " was expected\n"; if (currentTest.ShouldSucceedOnException()) { m_TestState = TestState.Success; } } else { m_TestState = TestState.Exception; m_Stacktrace = stacktrace; } } break; case LogType.Assert: case LogType.Error: m_TestState = TestState.Failure; m_Stacktrace = stacktrace; break; case LogType.Log: if (m_TestState == TestState.Running && condition.StartsWith(IntegrationTest.passMessage)) { m_TestState = TestState.Success; } if (condition.StartsWith(IntegrationTest.failMessage)) { m_TestState = TestState.Failure; } break; } } public IEnumerator StateMachine() { TestRunnerCallback.RunStarted(Application.platform.ToString(), m_TestComponents); while (true) { if (!m_TestsProvider.AnyTestsLeft() && currentTest == null) { FinishTestRun(); yield break; } if (currentTest == null) { StartNewTest(); } if (currentTest != null) { if (m_TestState == TestState.Running) { if(currentTest.ShouldSucceedOnAssertions()) { var assertionsToCheck = currentTest.gameObject.GetComponentsInChildren().Where(a => a.enabled).ToArray(); if (assertionsToCheck.Any () && assertionsToCheck.All(a => a.checksPerformed > 0)) { IntegrationTest.Pass(currentTest.gameObject); m_TestState = TestState.Success; } } if (currentTest != null && Time.time > m_StartTime + currentTest.GetTimeout()) { m_TestState = TestState.Timeout; } } switch (m_TestState) { case TestState.Success: LogMessage(k_FinishedMessage); FinishTest(TestResult.ResultType.Success); break; case TestState.Failure: LogMessage(k_FailedMessage); FinishTest(TestResult.ResultType.Failed); break; case TestState.Exception: LogMessage(k_FailedExceptionMessage); FinishTest(TestResult.ResultType.FailedException); break; case TestState.Timeout: LogMessage(k_TimeoutMessage); FinishTest(TestResult.ResultType.Timeout); break; case TestState.Ignored: LogMessage(k_IgnoredMessage); FinishTest(TestResult.ResultType.Ignored); break; } } yield return null; } } private void LogMessage(string message) { if (currentTest != null) Debug.Log(message + " (" + currentTest.Name + ")", currentTest.gameObject); else Debug.Log(message); } private void FinishTestRun() { PrintResultToLog(); TestRunnerCallback.RunFinished(m_ResultList); LoadNextLevelOrQuit(); } private void PrintResultToLog() { var resultString = ""; resultString += "Passed: " + m_ResultList.Count(t => t.IsSuccess); if (m_ResultList.Any(result => result.IsFailure)) { resultString += " Failed: " + m_ResultList.Count(t => t.IsFailure); Debug.Log("Failed tests: " + string.Join(", ", m_ResultList.Where(t => t.IsFailure).Select(result => result.Name).ToArray())); } if (m_ResultList.Any(result => result.IsIgnored)) { resultString += " Ignored: " + m_ResultList.Count(t => t.IsIgnored); Debug.Log("Ignored tests: " + string.Join(", ", m_ResultList.Where(t => t.IsIgnored).Select(result => result.Name).ToArray())); } Debug.Log(resultString); } private void LoadNextLevelOrQuit() { if (isInitializedByRunner) return; TestSceneNumber += 1; string testScene = m_Configurator.GetIntegrationTestScenes(TestSceneNumber); if (testScene != null) SceneManager.LoadScene(Path.GetFileNameWithoutExtension(testScene)); else { TestRunnerCallback.AllScenesFinished(); k_ResultRenderer.ShowResults(); #if UNITY_EDITOR var prevScenes = m_Configurator.GetPreviousScenesToRestore(); if(prevScenes!=null) { UnityEditor.EditorBuildSettings.scenes = prevScenes; } #endif if (m_Configurator.isBatchRun && m_Configurator.sendResultsOverNetwork) Application.Quit(); } } public void OnGUI() { k_ResultRenderer.Draw(); } private void StartNewTest() { m_TestMessages = ""; m_Stacktrace = ""; m_TestState = TestState.Running; m_StartTime = Time.time; currentTest = m_TestsProvider.GetNextTest() as TestComponent; var testResult = m_ResultList.Single(result => result.TestComponent == currentTest); if (currentTest != null && currentTest.IsExludedOnThisPlatform()) { m_TestState = TestState.Ignored; Debug.Log(currentTest.gameObject.name + " is excluded on this platform"); } // don't ignore test if user initiated it from the runner and it's the only test that is being run if (currentTest != null && (currentTest.IsIgnored() && !(isInitializedByRunner && m_ResultList.Count == 1))) m_TestState = TestState.Ignored; LogMessage(k_StartedMessage); TestRunnerCallback.TestStarted(testResult); } private void FinishTest(TestResult.ResultType result) { m_TestsProvider.FinishTest(currentTest); var testResult = m_ResultList.Single(t => t.GameObject == currentTest.gameObject); testResult.resultType = result; testResult.duration = Time.time - m_StartTime; testResult.messages = m_TestMessages; testResult.stacktrace = m_Stacktrace; TestRunnerCallback.TestFinished(testResult); currentTest = null; if (!testResult.IsSuccess && testResult.Executed && !testResult.IsIgnored) k_ResultRenderer.AddResults(SceneManager.GetActiveScene().name, testResult); } #region Test Runner Helpers public static TestRunner GetTestRunner() { TestRunner testRunnerComponent = null; var testRunnerComponents = Resources.FindObjectsOfTypeAll(typeof(TestRunner)); if (testRunnerComponents.Count() > 1) foreach (var t in testRunnerComponents) DestroyImmediate(((TestRunner)t).gameObject); else if (!testRunnerComponents.Any()) testRunnerComponent = Create().GetComponent(); else testRunnerComponent = testRunnerComponents.Single() as TestRunner; return testRunnerComponent; } private static GameObject Create() { var runner = new GameObject("TestRunner"); runner.AddComponent(); Debug.Log("Created Test Runner"); return runner; } private static bool IsBatchMode() { #if !UNITY_METRO const string internalEditorUtilityClassName = "UnityEditorInternal.InternalEditorUtility, UnityEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"; var t = Type.GetType(internalEditorUtilityClassName, false); if (t == null) return false; const string inBatchModeProperty = "inBatchMode"; var prop = t.GetProperty(inBatchModeProperty); return (bool)prop.GetValue(null, null); #else // if !UNITY_METRO return false; #endif // if !UNITY_METRO } #endregion enum TestState { Running, Success, Failure, Exception, Timeout, Ignored } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestRunner.cs.meta ================================================ fileFormatVersion: 2 guid: 5c3afc1c624179749bcdecf7b0224902 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestRunnerCallbackList.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; namespace UnityTest.IntegrationTestRunner { public class TestRunnerCallbackList : ITestRunnerCallback { private readonly List m_CallbackList = new List(); public void Add(ITestRunnerCallback callback) { m_CallbackList.Add(callback); } public void Remove(ITestRunnerCallback callback) { m_CallbackList.Remove(callback); } public void RunStarted(string platform, List testsToRun) { foreach (var unitTestRunnerCallback in m_CallbackList) { unitTestRunnerCallback.RunStarted(platform, testsToRun); } } public void RunFinished(List testResults) { foreach (var unitTestRunnerCallback in m_CallbackList) { unitTestRunnerCallback.RunFinished(testResults); } } public void AllScenesFinished() { foreach (var unitTestRunnerCallback in m_CallbackList) { unitTestRunnerCallback.AllScenesFinished(); } } public void TestStarted(TestResult test) { foreach (var unitTestRunnerCallback in m_CallbackList) { unitTestRunnerCallback.TestStarted(test); } } public void TestFinished(TestResult test) { foreach (var unitTestRunnerCallback in m_CallbackList) { unitTestRunnerCallback.TestFinished(test); } } public void TestRunInterrupted(List testsNotRun) { foreach (var unitTestRunnerCallback in m_CallbackList) { unitTestRunnerCallback.TestRunInterrupted(testsNotRun); } } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestRunnerCallbackList.cs.meta ================================================ fileFormatVersion: 2 guid: 7729da83f7c08d244b5788c870a93780 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestRunnerConfigurator.cs ================================================ #if !UNITY_METRO && !UNITY_WEBPLAYER && (UNITY_PRO_LICENSE || !(UNITY_ANDROID || UNITY_IPHONE)) #define UTT_SOCKETS_SUPPORTED #endif using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using UnityEngine; using UnityTest.IntegrationTestRunner; #if UTT_SOCKETS_SUPPORTED using System.Net; using System.Net.Sockets; using System.Net.NetworkInformation; #endif #if UNITY_EDITOR using UnityEditorInternal; #endif namespace UnityTest { public class TestRunnerConfigurator { public static string integrationTestsNetwork = "networkconfig.txt"; public static string batchRunFileMarker = "batchrun.txt"; public static string testScenesToRun = "testscenes.txt"; public static string previousScenes = "previousScenes.txt"; public bool isBatchRun { get; private set; } public bool sendResultsOverNetwork { get; private set; } #if UTT_SOCKETS_SUPPORTED private readonly List m_IPEndPointList = new List(); #endif public TestRunnerConfigurator() { CheckForBatchMode(); CheckForSendingResultsOverNetwork(); } #if UNITY_EDITOR public UnityEditor.EditorBuildSettingsScene[] GetPreviousScenesToRestore() { string text = null; if (Application.isEditor) { text = GetTextFromTempFile(previousScenes); } if(text != null) { var serializer = new System.Xml.Serialization.XmlSerializer(typeof(UnityEditor.EditorBuildSettingsScene[])); using(var textReader = new StringReader(text)) { try { return (UnityEditor.EditorBuildSettingsScene[] )serializer.Deserialize(textReader); } catch (System.Xml.XmlException) { return null; } } } return null; } #endif public string GetIntegrationTestScenes(int testSceneNum) { string text; if (Application.isEditor) text = GetTextFromTempFile(testScenesToRun); else text = GetTextFromTextAsset(testScenesToRun); List sceneList = new List(); foreach (var line in text.Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries)) { sceneList.Add(line.ToString()); } if (testSceneNum < sceneList.Count) return sceneList.ElementAt(testSceneNum); else return null; } private void CheckForSendingResultsOverNetwork() { #if UTT_SOCKETS_SUPPORTED string text; if (Application.isEditor) text = GetTextFromTempFile(integrationTestsNetwork); else text = GetTextFromTextAsset(integrationTestsNetwork); if (text == null) return; sendResultsOverNetwork = true; m_IPEndPointList.Clear(); foreach (var line in text.Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries)) { var idx = line.IndexOf(':'); if (idx == -1) throw new Exception(line); var ip = line.Substring(0, idx); var port = line.Substring(idx + 1); m_IPEndPointList.Add(new IPEndPoint(IPAddress.Parse(ip), Int32.Parse(port))); } #endif // if UTT_SOCKETS_SUPPORTED } private static string GetTextFromTextAsset(string fileName) { var nameWithoutExtension = fileName.Substring(0, fileName.LastIndexOf('.')); var resultpathFile = Resources.Load(nameWithoutExtension) as TextAsset; return resultpathFile != null ? resultpathFile.text : null; } private static string GetTextFromTempFile(string fileName) { string text = null; try { #if UNITY_EDITOR && !UNITY_WEBPLAYER text = File.ReadAllText(Path.Combine("Temp", fileName)); #endif } catch { return null; } return text; } private void CheckForBatchMode() { #if IMITATE_BATCH_MODE isBatchRun = true; #elif UNITY_EDITOR if (Application.isEditor && InternalEditorUtility.inBatchMode) isBatchRun = true; #else if (GetTextFromTextAsset(batchRunFileMarker) != null) isBatchRun = true; #endif } public static List GetAvailableNetworkIPs() { #if UTT_SOCKETS_SUPPORTED if (!NetworkInterface.GetIsNetworkAvailable()) return new List{IPAddress.Loopback.ToString()}; var ipList = new List(); var allIpsList = new List(); foreach (var netInterface in NetworkInterface.GetAllNetworkInterfaces()) { if (netInterface.NetworkInterfaceType != NetworkInterfaceType.Wireless80211 && netInterface.NetworkInterfaceType != NetworkInterfaceType.Ethernet) continue; var ipAdresses = netInterface.GetIPProperties().UnicastAddresses .Where(a => a.Address.AddressFamily == AddressFamily.InterNetwork); allIpsList.AddRange(ipAdresses); if (netInterface.OperationalStatus != OperationalStatus.Up) continue; ipList.AddRange(ipAdresses); } //On Mac 10.10 all interfaces return OperationalStatus.Unknown, thus this workaround if(!ipList.Any()) return allIpsList.Select(i => i.Address.ToString()).ToList(); // sort ip list by their masks to predict which ip belongs to lan network ipList.Sort((ip1, ip2) => { var mask1 = BitConverter.ToInt32(ip1.IPv4Mask.GetAddressBytes().Reverse().ToArray(), 0); var mask2 = BitConverter.ToInt32(ip2.IPv4Mask.GetAddressBytes().Reverse().ToArray(), 0); return mask2.CompareTo(mask1); }); if (ipList.Count == 0) return new List { IPAddress.Loopback.ToString() }; return ipList.Select(i => i.Address.ToString()).ToList(); #else return new List(); #endif // if UTT_SOCKETS_SUPPORTED } public ITestRunnerCallback ResolveNetworkConnection() { #if UTT_SOCKETS_SUPPORTED var nrsList = m_IPEndPointList.Select(ipEndPoint => new NetworkResultSender(ipEndPoint.Address.ToString(), ipEndPoint.Port)).ToList(); var timeout = TimeSpan.FromSeconds(30); DateTime startTime = DateTime.Now; while ((DateTime.Now - startTime) < timeout) { foreach (var networkResultSender in nrsList) { try { if (!networkResultSender.Ping()) continue; } catch (Exception e) { Debug.LogException(e); sendResultsOverNetwork = false; return null; } return networkResultSender; } Thread.Sleep(500); } Debug.LogError("Couldn't connect to the server: " + string.Join(", ", m_IPEndPointList.Select(ipep => ipep.Address + ":" + ipep.Port).ToArray())); sendResultsOverNetwork = false; #endif // if UTT_SOCKETS_SUPPORTED return null; } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner/TestRunnerConfigurator.cs.meta ================================================ fileFormatVersion: 2 guid: 05aae864572254e478ed2f0489cdd335 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestRunner.meta ================================================ fileFormatVersion: 2 guid: da93545c3ab1aa043bcfb22281b1f66c folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/CallTesting.cs ================================================ using System; using System.Collections.Generic; using UnityEngine; namespace UnityTest { public class CallTesting : MonoBehaviour { public enum Functions { CallAfterSeconds, CallAfterFrames, Start, Update, FixedUpdate, LateUpdate, OnDestroy, OnEnable, OnDisable, OnControllerColliderHit, OnParticleCollision, OnJointBreak, OnBecameInvisible, OnBecameVisible, OnTriggerEnter, OnTriggerExit, OnTriggerStay, OnCollisionEnter, OnCollisionExit, OnCollisionStay, OnTriggerEnter2D, OnTriggerExit2D, OnTriggerStay2D, OnCollisionEnter2D, OnCollisionExit2D, OnCollisionStay2D, } public enum Method { Pass, Fail } public int afterFrames = 0; public float afterSeconds = 0.0f; public Functions callOnMethod = Functions.Start; public Method methodToCall; private int m_StartFrame; private float m_StartTime; private void TryToCallTesting(Functions invokingMethod) { if (invokingMethod == callOnMethod) { if (methodToCall == Method.Pass) IntegrationTest.Pass(gameObject); else IntegrationTest.Fail(gameObject); afterFrames = 0; afterSeconds = 0.0f; m_StartTime = float.PositiveInfinity; m_StartFrame = int.MinValue; } } public void Start() { m_StartTime = Time.time; m_StartFrame = afterFrames; TryToCallTesting(Functions.Start); } public void Update() { TryToCallTesting(Functions.Update); CallAfterSeconds(); CallAfterFrames(); } private void CallAfterFrames() { if (afterFrames > 0 && (m_StartFrame + afterFrames) <= Time.frameCount) TryToCallTesting(Functions.CallAfterFrames); } private void CallAfterSeconds() { if ((m_StartTime + afterSeconds) <= Time.time) TryToCallTesting(Functions.CallAfterSeconds); } public void OnDisable() { TryToCallTesting(Functions.OnDisable); } public void OnEnable() { TryToCallTesting(Functions.OnEnable); } public void OnDestroy() { TryToCallTesting(Functions.OnDestroy); } public void FixedUpdate() { TryToCallTesting(Functions.FixedUpdate); } public void LateUpdate() { TryToCallTesting(Functions.LateUpdate); } public void OnControllerColliderHit() { TryToCallTesting(Functions.OnControllerColliderHit); } public void OnParticleCollision() { TryToCallTesting(Functions.OnParticleCollision); } public void OnJointBreak() { TryToCallTesting(Functions.OnJointBreak); } public void OnBecameInvisible() { TryToCallTesting(Functions.OnBecameInvisible); } public void OnBecameVisible() { TryToCallTesting(Functions.OnBecameVisible); } public void OnTriggerEnter() { TryToCallTesting(Functions.OnTriggerEnter); } public void OnTriggerExit() { TryToCallTesting(Functions.OnTriggerExit); } public void OnTriggerStay() { TryToCallTesting(Functions.OnTriggerStay); } public void OnCollisionEnter() { TryToCallTesting(Functions.OnCollisionEnter); } public void OnCollisionExit() { TryToCallTesting(Functions.OnCollisionExit); } public void OnCollisionStay() { TryToCallTesting(Functions.OnCollisionStay); } public void OnTriggerEnter2D() { TryToCallTesting(Functions.OnTriggerEnter2D); } public void OnTriggerExit2D() { TryToCallTesting(Functions.OnTriggerExit2D); } public void OnTriggerStay2D() { TryToCallTesting(Functions.OnTriggerStay2D); } public void OnCollisionEnter2D() { TryToCallTesting(Functions.OnCollisionEnter2D); } public void OnCollisionExit2D() { TryToCallTesting(Functions.OnCollisionExit2D); } public void OnCollisionStay2D() { TryToCallTesting(Functions.OnCollisionStay2D); } } } ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/CallTesting.cs.meta ================================================ fileFormatVersion: 2 guid: 0d545b1288d5fc74d8e6c961fb67ab18 MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/CubeCollisionFailure.prefab.meta ================================================ fileFormatVersion: 2 guid: d5fc3c3488db1e74689f1fc67c33944a NativeFormatImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/CubeCollisionSuccess.prefab.meta ================================================ fileFormatVersion: 2 guid: 1228dff762eab21488cfefd42792c37b NativeFormatImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/CubeTriggerFailure.prefab.meta ================================================ fileFormatVersion: 2 guid: 616ddafe39e02da4081e56f7f763af3c NativeFormatImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/CubeTriggerSuccess.prefab.meta ================================================ fileFormatVersion: 2 guid: d940e636fd44be84e9b7e8da46f700ef NativeFormatImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/Materials/green.mat.meta ================================================ fileFormatVersion: 2 guid: 43da3275cd08d41429f56675d70c58df NativeFormatImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/Materials/red.mat.meta ================================================ fileFormatVersion: 2 guid: 03f3b4747259a364b800508ac27e1c17 NativeFormatImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/Materials.meta ================================================ fileFormatVersion: 2 guid: 8d55f43641ba3c14eaa1156abc0edabd folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/green.png.meta ================================================ fileFormatVersion: 2 guid: 928be703400f4eb48af2f94d55bf3f74 TextureImporter: serializedVersion: 2 mipmaps: mipMapMode: 0 enableMipMap: 1 linearTexture: 0 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 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 1024 textureSettings: filterMode: -1 aniso: -1 mipBias: -1 wrapMode: -1 nPOTScale: 1 lightmap: 0 compressionQuality: 50 spriteMode: 0 autoDetectMinSpriteSize: 4 gridPadding: 0 gridOffsetX: 0 gridOffsetY: 0 gridSizeX: 64 gridSizeY: 64 spriteExtrude: 1 alignment: 0 spritePivot: {x: .5, y: .5} spriteAtlasHint: 0 spritePixelsToUnits: 100 generateSpritePolygon: 0 spritePolygonAlphaCutoff: 254 spritePolygonDetail: .5 alphaIsTransparency: 0 textureType: -1 buildTargetSettings: [] spriteSheet: spriteFrames: [] userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets/red.png.meta ================================================ fileFormatVersion: 2 guid: 591632297e74ba34fa4c65d1265d370a TextureImporter: serializedVersion: 2 mipmaps: mipMapMode: 0 enableMipMap: 1 linearTexture: 0 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 seamlessCubemap: 0 textureFormat: -1 maxTextureSize: 1024 textureSettings: filterMode: -1 aniso: -1 mipBias: -1 wrapMode: -1 nPOTScale: 1 lightmap: 0 compressionQuality: 50 spriteMode: 0 autoDetectMinSpriteSize: 4 gridPadding: 0 gridOffsetX: 0 gridOffsetY: 0 gridSizeX: 64 gridSizeY: 64 spriteExtrude: 1 alignment: 0 spritePivot: {x: .5, y: .5} spriteAtlasHint: 0 spritePixelsToUnits: 100 generateSpritePolygon: 0 spritePolygonAlphaCutoff: 254 spritePolygonDetail: .5 alphaIsTransparency: 0 textureType: -1 buildTargetSettings: [] spriteSheet: spriteFrames: [] userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework/TestingAssets.meta ================================================ fileFormatVersion: 2 guid: 1d1ccbd729921544dbd71f7e80c405b6 folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/IntegrationTestsFramework.meta ================================================ fileFormatVersion: 2 guid: 241054a0fe63fbb4bb51609fce9b3112 folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/LICENSE.txt ================================================ This software is provided 'as-is', without any express or implied warranty. THE UNITY TEST TOOLS CONTAIN THE FOLLOWING THIRD PARTY LIBRARIES: NSubstitute Copyright (c) 2009 Anthony Egerton (nsubstitute@delfish.com) and David Tchepak (dave@davesquared.net). All rights reserved. NUnit Portions Copyright 2002-2009 Charlie Poole or Copyright 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright 2000-2002 Philip A. Craig Cecil Copyright (c) 2008 - 2011, Jb Evain NSubstitute is open source software, licensed under the BSD License. The modifications made by Unity are available on github. Copyright (c) 2009 Anthony Egerton (nsubstitute@delfish.com) and David Tchepak (dave@davesquared.net) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of the copyright holders nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [ http://www.opensource.org/licenses/bsd-license.php ] NUnit is provided 'as-is', without any express or implied warranty. The modifications made by Unity are available on github. Copyright 2002-2013 Charlie Poole Copyright 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov Copyright 2000-2002 Philip A. Craig This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. Portions Copyright 2002-2013 Charlie Poole or Copyright 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright 2000-2002 Philip A. Craig 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Cecil is licensed under the MIT/X11. Copyright (c) 2008 - 2011, Jb Evain 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. ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/LICENSE.txt.meta ================================================ fileFormatVersion: 2 guid: 0d5b4501bf773f349ad95ec34491dc61 TextScriptImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/UnitTesting/Editor/NSubstitute/NSubstitute.dll.meta ================================================ fileFormatVersion: 2 guid: 3c5e1afc6e0d68849ae6639aff58cfc7 MonoAssemblyImporter: serializedVersion: 1 iconMap: {} executionOrder: {} userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/UnitTesting/Editor/NSubstitute.meta ================================================ fileFormatVersion: 2 guid: 92b38897656771f409e9235955975754 folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/UnitTesting/Editor.meta ================================================ fileFormatVersion: 2 guid: 59b47eb3fc62eb44cb73a329a1e6b6cb DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/UnitTesting.meta ================================================ fileFormatVersion: 2 guid: 9a87f1db904f1e948a2385ab9961e3aa folderAsset: yes DefaultImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/changelog.txt ================================================ Version 1.5.9 - Updated tools for Unity 5.4 - Bugfixes Version 1.5.8 - Bugfixes Version 1.5.7 - Updated tools for Unity 5.3 Version 1.5.6 - Updated Mono.Cecil.dll and Mono.Cecil.Mdb.dll libraries Version 1.5.5 - Unit Tests Runner rendering improvments - Platform runner can include auxiliary scenes - other improvments and bugfixes Version 1.5.4 - APIs updates Version 1.5.3 - Bug fixes Version 1.5.2 - Bug fixes - Minor improvments Version 1.5.1 - removed redundant and not applicable options - fixed 5.0 related bugs Version 1.5.0 - Unity 5 related compatibility changes Version 1.4.6 - Bug fixes - Minor improvments Version 1.4.5 - Added "Pause on test failure" option for integration tests - bugfixes and code refactorization - fixed UI bug where test details were not refreshed is the label was focused Version 1.4.4 - Minimal supported Unity version is now 4.3 - UI changes - code refactoring Version 1.4.3 - Remove reference to Resources.LoadAssetAtPath from runtime code Version 1.4.2 (assertion component) - fixed string comparer bug that prevented updating the value (unit tests) - unit test runner will log to stdout now - fixes issues with opening tests in IDEs (integration tests) - transform component is now visible for integration tests components - added better support for mac's keyboard - fixed 'succeed on assertion' for code generated assertion (other) - minor bugfixes - general improvments Version 1.4.1 - Fixed platform compilation issues - Fixed typos in labels - Removed docs and left a link to online docs - Added Unity version and target platform to result files - Other bugfixes Version 1.4 (integration tests) - Platform runner will send the results back to the editor via TCP now - Added naming convention for running tests in batch mode - It's possible to cancel the run in the editor in between the tests now - Added message filtering for integration tests results - Added check for RegisterLogCallback in case something else overrides it - Error messages will now fail integration tests - Fixed dynamic integration tests not being properly reset - Fixed platform runner for BlackBerry platform (assertion component) - fixed the component editor (common) - Made settings to be saved per project - Fixed resolving icons when there are more UnityTestTools folders in the project - Fixed process return code when running in batch mode Version 1.3.2 - Fixed integration tests performance issues Version 1.3.1 - Updated Japanese docs Version 1.3 Fixes: (unit tests) - nUnit will no longer change the Environment.CurrentDirectory when running tests - fixed issues with asserting GameObject == null (integration tests) - fix the issue with passing or failing test in first frame - fixed bug where ignored tests were still run in ITF (assertion component) - fixed resolving properties to include derived types Improvements: (unit tests) - refactored result renderer - reenabled Random attribute - added Category filter - NSubstitute updated to version 1.7.2 - result now will be dimmed after recompilation - running tests in background will now work without having the window focused - all assemblies in the project referencing 'nunit.framework' will now be included in the test list (integration tests) - updated platform exclusion mechanism - refactored result renderer - the runner should work even if the runner window is not focused - added possibility to create integration tests from code - the runner will now always run in background (if the window is not focused) (assertion component) - added API for creating assertions from code - added new example (common) - GUI improvements - you no longer need to change the path to icons when moving the tools to another directory - made test details/results resizeable and scrollable - added character escape for generated result XML Version 1.2.1 - Fixed Unit Test Batch runner Version 1.2 Fixes: - Windows Store related compilation issues - other Improvements: (unit tests) - unit test runner can run in background now without having the runner window open - unit test batch runner can take a result file path as a parameter - changed undo system for unit test runner and UnityUnitTest base class - execution time in now visible in test details - fixed a bug with tests that inherit from a base test class (integration tests) - added hierarchical structure for integration tests - added Player runner to automate running integration tests on platforms - Integration tests batch runner can take a result directory as a parameter - Integration tests batch runner can run tests on platforms - results are rendered in a player (assertion component) - changed default failure messages - it's possible to override failure action on comparer failure - added code stripper for assertions. - vast performance improvement - fixed bugs Other: - "Hide in hierarchy" option was removed from integration test runner - "Focus on selection" option was removed from integration test runner - "Hide test runner" option was removed from integration test runner - result files for unit tests and integration tests are now not generated when running tests from the editor - UI improvements - removed UnityScript and Boo examples - WP8 compatibility fixes Version 1.1.1 Other: - Documentation in Japanese was added Version 1.1 Fixes: - fixed display error that happened when unit test class inherited from another TestFixture class - fixed false positive result when "Succeed on assertions" was checked and no assertions were present in the test - fixed XmlResultWriter to be generate XML file compatible with XSD scheme - XmlResultWriter result writer was rewritten to remove XML libraries dependency - Fixed an issue with a check that should be executed once after a specified frame in OnUpdate. - added missing file UnityUnitTest.cs Improvements: - Added Japanese translation of the documentation - ErrorPause value will be reverted to previous state after test run finishes - Assertion Component will not copy reference to a GameObject if the GameObject is the same as the component is attached to. Instead, it will set the reference to the new GameObject. - Integration tests batch runner can now run multiple scenes - Unit test runner will now include tests written in UnityScript and Boo - Unit tests will not run automatically if the compilation failes - Added scene auto-save option to the Unit Test Runner Other: - changed icons - restructured project files - moved XmlResultWriter to Common folder - added UnityScript and Boo unit tests examples - added more unit tests examples - Test runners visual adjustments Version 1.0 - Initial release ================================================ FILE: Foundation.Unity/Assets/UnityTestTools/changelog.txt.meta ================================================ fileFormatVersion: 2 guid: 29b770d9107643740b69cb98b00430aa TextScriptImporter: userData: ================================================ FILE: Foundation.Unity/Assets/UnityTestTools.meta ================================================ fileFormatVersion: 2 guid: 32c08a32d8031cd4680782f6fba0785e folderAsset: yes timeCreated: 1473353364 licenseType: Free DefaultImporter: userData: assetBundleName: assetBundleVariant: ================================================ FILE: Foundation.Unity/Foundation.Unity.CSharp.Editor.csproj ================================================  Debug AnyCPU 10.0.20506 2.0 {EBD395B8-8FDB-2C98-F38F-468B603ED0F2} Library Assembly-CSharp-Editor 512 {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} .NETFramework v3.5 Unity Full v3.5 Editor:5 StandaloneWindows:5 5.4.0f3 4 pdbonly false Temp\UnityVS_bin\Debug\ Temp\UnityVS_obj\Debug\ prompt 4 DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_4_0;UNITY_5_4;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_EDITOR_RETINA;ENABLE_RETINA_GUISTYLES;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;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_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;UNITY_TEAM_LICENSE;ENABLE_VSTU false pdbonly false Temp\UnityVS_bin\Release\ Temp\UnityVS_obj\Release\ prompt 4 TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_4_0;UNITY_5_4;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_EDITOR_RETINA;ENABLE_RETINA_GUISTYLES;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;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_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;UNITY_TEAM_LICENSE;ENABLE_VSTU false Library\UnityAssemblies\UnityEngine.dll Library\UnityAssemblies\UnityEditor.dll Library\UnityAssemblies\UnityEditor.Advertisements.dll Library\UnityAssemblies\nunit.framework.dll Library\UnityAssemblies\UnityEditor.EditorTestsRunner.dll Library\UnityAssemblies\UnityEngine.UI.dll Library\UnityAssemblies\UnityEditor.UI.dll Library\UnityAssemblies\UnityEngine.Networking.dll Library\UnityAssemblies\UnityEditor.Networking.dll Library\UnityAssemblies\UnityEditor.TreeEditor.dll Library\UnityAssemblies\UnityEditor.Graphs.dll Library\UnityAssemblies\UnityEditor.WindowsStandalone.Extensions.dll Library\UnityAssemblies\SyntaxTree.VisualStudio.Unity.Bridge.dll Assets\Plugins\Foundation.Architecture.Unity3d.dll Assets\UnityTestTools\IntegrationTestsFramework\Libs\Mono.Cecil.dll Assets\UnityTestTools\IntegrationTestsFramework\Libs\Mono.Cecil.Mdb.dll Assets\UnityTestTools\UnitTesting\Editor\NSubstitute\NSubstitute.dll {63114D93-2945-1E5A-8424-E315C5817808} Foundation.Unity.CSharp ================================================ FILE: Foundation.Unity/Foundation.Unity.CSharp.Plugins.csproj ================================================  Debug AnyCPU 10.0.20506 2.0 {2E00EE84-877B-C583-6CEC-3B9D59956AA1} Library Assembly-CSharp-firstpass 512 {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} .NETFramework v3.5 Unity Subset v3.5 GamePlugins:3 StandaloneWindows:5 5.4.0f3 4 pdbonly false Temp\UnityVS_bin\Debug\ Temp\UnityVS_obj\Debug\ prompt 4 DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_4_0;UNITY_5_4;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_EDITOR_RETINA;ENABLE_RETINA_GUISTYLES;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;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_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;UNITY_TEAM_LICENSE;ENABLE_VSTU false pdbonly false Temp\UnityVS_bin\Release\ Temp\UnityVS_obj\Release\ prompt 4 TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_4_0;UNITY_5_4;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_EDITOR_RETINA;ENABLE_RETINA_GUISTYLES;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;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_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;UNITY_TEAM_LICENSE;ENABLE_VSTU false Library\UnityAssemblies\UnityEngine.dll Library\UnityAssemblies\UnityEngine.UI.dll Library\UnityAssemblies\UnityEngine.Networking.dll Library\UnityAssemblies\UnityEditor.dll Assets\Plugins\Foundation.Architecture.Unity3d.dll Assets\UnityTestTools\IntegrationTestsFramework\Libs\Mono.Cecil.dll Assets\UnityTestTools\IntegrationTestsFramework\Libs\Mono.Cecil.Mdb.dll ================================================ FILE: Foundation.Unity/Foundation.Unity.CSharp.csproj ================================================  Debug AnyCPU 10.0.20506 2.0 {63114D93-2945-1E5A-8424-E315C5817808} Library Assembly-CSharp 512 {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} .NETFramework v3.5 Unity Subset v3.5 Game:1 StandaloneWindows:5 5.4.0f3 4 pdbonly false Temp\UnityVS_bin\Debug\ Temp\UnityVS_obj\Debug\ prompt 4 DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_4_0;UNITY_5_4;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_EDITOR_RETINA;ENABLE_RETINA_GUISTYLES;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;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_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;UNITY_TEAM_LICENSE;ENABLE_VSTU false pdbonly false Temp\UnityVS_bin\Release\ Temp\UnityVS_obj\Release\ prompt 4 TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_4_0;UNITY_5_4;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_EDITOR_RETINA;ENABLE_RETINA_GUISTYLES;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;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_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;INCLUDE_PUBNUB;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;UNITY_TEAM_LICENSE;ENABLE_VSTU false Library\UnityAssemblies\UnityEngine.dll Library\UnityAssemblies\UnityEngine.UI.dll Library\UnityAssemblies\UnityEngine.Networking.dll Library\UnityAssemblies\UnityEditor.dll Assets\Plugins\Foundation.Architecture.Unity3d.dll Assets\UnityTestTools\IntegrationTestsFramework\Libs\Mono.Cecil.dll Assets\UnityTestTools\IntegrationTestsFramework\Libs\Mono.Cecil.Mdb.dll ================================================ FILE: Foundation.Unity/Foundation.Unity.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2015 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Foundation.Unity.CSharp", "Foundation.Unity.CSharp.csproj", "{63114D93-2945-1E5A-8424-E315C5817808}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Foundation.Unity.CSharp.Editor", "Foundation.Unity.CSharp.Editor.csproj", "{EBD395B8-8FDB-2C98-F38F-468B603ED0F2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {63114D93-2945-1E5A-8424-E315C5817808}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {63114D93-2945-1E5A-8424-E315C5817808}.Debug|Any CPU.Build.0 = Debug|Any CPU {63114D93-2945-1E5A-8424-E315C5817808}.Release|Any CPU.ActiveCfg = Release|Any CPU {63114D93-2945-1E5A-8424-E315C5817808}.Release|Any CPU.Build.0 = Release|Any CPU {EBD395B8-8FDB-2C98-F38F-468B603ED0F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EBD395B8-8FDB-2C98-F38F-468B603ED0F2}.Debug|Any CPU.Build.0 = Debug|Any CPU {EBD395B8-8FDB-2C98-F38F-468B603ED0F2}.Release|Any CPU.ActiveCfg = Release|Any CPU {EBD395B8-8FDB-2C98-F38F-468B603ED0F2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: Injector.md ================================================ #Injector For the resolving of dependencies. ### RegisterTransient A new instance for each get. Must register a factory or a type. ````` //Register a concrete type keyed by an interface Container.RegisterTransient(); //Register a concrete type keyed by its own (concrete) type Container.RegisterTransient(); //Register a concrete type keyed by its own (concrete) type and a custom factory action Container.RegisterTransient(()=> new Document()); ````` ### RegisterSingleton A static instance. ````` //Register a concrete type keyed by an interface Container.RegisterSingleton(); //Register a concrete type keyed by its own (concrete) type Container.RegisterSingleton(); //Register a concrete type keyed by its own (concrete) type and a custom factory action Container.RegisterSingleton(()=> new Document()); //Register a concrete type keyed by its own (concrete) type and a pre instantiated instance //All loads are lazy, except this one. var document = new Document(); Container.RegisterSingleton(document); ````` ### Get get from the container. ````` Container.RegisterSingleton(); Container.RegisterSingleton(); var words = Container.Get(); var sentances = Container.Get(); ````` ### Inject Into Uses reflection to resolve dependencies. Useful for daisy chaining. ````` public class MyScript { [Inject] protected IWordService Words; void Awake() { Container.RegisterSingleton(); Container.InjectInto(this); Asset.IsNotNull(Words); } } ````` ### Implementation Details (Gotchas) - Since we are using a dictionary to key references internally, if you register with an interface you must request with that same interface. If you reference with the concrete type, you must get using that concrete type. - All lazy loaded dependencies will pass to the InjectInto method when they generated. That means if they have dependencies, they should be injected for you. - Please Register dependencies lowest level first, to minimize the risk of not finding things. ================================================ FILE: LICENSE.md ================================================ # License THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. 1. Definitions "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. "Distribute" means to make available to the public the original and copies of the Work through sale or other transfer of ownership. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. 2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; and, to Distribute and Publicly Perform the Work including as incorporated in Collections. The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Adaptations. Subject to 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d). 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. If You Distribute, or Publicly Perform the Work or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Collection, at a minimum such credit will appear, if a credit for all contributing authors of Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. For the avoidance of doubt: Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b). Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. 5. Representations, Warranties and Disclaimer UNLESS OTHERWISE MUTUALLY AGREED BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. Termination This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. 8. Miscellaneous Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. ================================================ FILE: Logging.md ================================================ # Logging LogService is a light weight wrapper around Console.WriteLine and Debug.Log. It is inteded a a cross platform logging service that can be called on shared code. ```` /// /// Cross platform logging interface /// public class LogService { /// /// extensibility point /// public static event Action OnLog = delegate { }; public static void Log(LogModel model); public static void Log(string message); public static void LogWarning(string message); public static void LogError(string message); public static void LogException(Exception ex); public static void LogException(string message, Exception ex); } ```` ================================================ FILE: ObjectEvents.md ================================================ # Object Events A object-specific message broker for relaying events routed by the message type. This is a drop-in replacement for GameObject.SendMessage ## Use ````` public void TestObjectRoute() { //define our message, a class var msg = new Msg { Content = MagicString }; //define our routes (strings or game objects or something else) var route = new GameObject(); //subscribe using the object reference ObjectEvents.Subscribe(route, Handler); //many ways to send ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg); ObjectEvents.Publish(route, msg, typeof(GameObject), typeof(Msg)); //be sure to clean up as we are not using weak references ObjectEvents.Unsubscribe(route, Handler); } public void Handler(Msg myMessage) { //Do Something } ````` ================================================ FILE: Observable.md ================================================ # Observables Observables is a design pattern where objects can listen to other objects for update notification. The most practical use case of this is MVVM, where a view will 'bind' to a view model and redraw itself when that view model changes. ## Key components **IObservable** A event broadcaster. Something that can be listened to. ````` /// /// Data Source. Message Publisher Source /// /// public interface IObservable : IDisposable { /// /// Old School Change Delegate /// event Action OnPublish; /// /// Will Publish value /// /// void Publish(TModel model); } ````` **MVVMObservable** ````` /// /// Raises PropertyChange events for the view to listen to. /// public interface IMvvmObservable : IObservable {} /// /// MVVM Event Arguments /// public struct PropertyEvent { /// /// The Model /// public object Sender; /// /// Member name (property / method) /// public string Name; /// /// New Value /// public object Value; /// /// Refresh root /// public bool IsRefreshAll { get { return string.IsNullOrEmpty(Name); } } } ````` **ObservableObject** Implements IMvvmObservable for poco objects **ObservableBehaviour** Implements IMvvmObservable for MonoBehaviours objects **ObservableCollection** A specialized list with events for when items are added, removed, or changed. **ObservableProperty** An alternative way of observing an object which does not use magic strings. This object is generic and includes the change event internally. **ObservableProxy** Reflection is heavy and costly. This class makes it better. As a bonus, acts as a proxy for binding to non MVVM objects. - Wraps observable's (all of the above) and exposes an easy to use interface that binders can listen to. - Heavily cached since reflection is expensive - Supports methods and properties - Supports Observables and simple DTO's. (Those objects will be not raise change events, however) ## Metrics here are my current stats for calling a method 1000 times. Time is in StopWatch ticks. - Normal 81 - Reflected 1088 - Cached 82 - Proxy 182 ( 2 method calls + dictionary lookup. one to proxy, one to instance) ================================================ FILE: README.md ================================================ # Foundation A Framework level library for client / server development. Built with MSN best practices in mind. - **Features** - Super light weight, under 100kb - **Unit tests** for everything - Modular with no cross dependencies. Take only what you need. - Cross compiles to run in Unity3d, WebGL, .net45, and DotNetCore. [Injector : Service Locator / Inversion of control module](Injector.md) [Domain Events : Global Message Broker](DomainEvents.md) [Object Events : Routed Message broker / SendMessage replacement](ObjectEvents.md) [Observables : Databinding and MVVM Support](Observable.md) [Logging : Cross platform debug proxy](Logging.md) [Threading : Cross platform timer, update, coroutines and task runniner](Threading.md) ================================================ FILE: Threading.md ================================================ # Threading The threading service is a cross platform service for... - Doing background work - Doing work on the main thread from a background thread - Running coroutines - Registering 'Unity Style' updates - Registering 'Unity Style' coroutines - Registering 'Unity Style' delay invoke It is cross platform, so you can have time sensitive logic on your client and server running against this common api. ````` /// /// Main thread / Background thread utility /// /// /// Games need consistent threading / time logic on server and client. /// public static class ThreadingService { /// /// Checks if this is the main thread /// public static bool IsMainThread {get;} /// /// A long running (continuous) update loop /// /// Update Handler with delta time parameter /// public static IDisposable RunUpdate(Action callback); /// /// Registers a timeout (Wait and Invoke) /// public static IDisposable RunDelay(Action callback, float seconds = 5); /// /// A Coroutine. Like an Update Loop, but, execution broken up by yields /// public static void RunRoutine(IEnumerator routine); /// /// Executes an action on the main thread /// public static void RunMainThread(Action action); /// /// Executes an action on the background thread (if possible - webGl) /// public static void RunBackgroundThread(Action action); /// /// Run a background job with completion /// public static void RunBackgroundThread(Action backgroundWork, Action mainWork); } `````