From e7b10b1fef4fe60f0a2639519e88acc3fa0bab9a Mon Sep 17 00:00:00 2001 From: Brian Friesen Date: Wed, 21 May 2014 09:47:22 -0400 Subject: [PATCH] Add tests for framework initialization. --- .../ModuleInitializer.cs | 14 ++++ .../Rock.Core.IntegrationTests.csproj | 12 ++++ Rock.Core.IntegrationTests/packages.config | 1 + .../FrameworkInitializerTestHelper.cs | 29 ++++++++ .../ModuleInitializer.cs | 10 +++ ...er_UnitTestSupport_FrameworkInitializer.cs | 21 ++++++ .../Properties/AssemblyInfo.cs | 36 ++++++++++ ...e.ModuleInitializer.UnitTestSupport.csproj | 67 +++++++++++++++++++ .../packages.config | 4 ++ .../ModuleInitializer.cs | 10 +++ .../ModuleInitializerTests.cs | 46 +++++++++++++ ...ock_Core_UnitTests_FrameworkInitializer.cs | 22 ++++++ .../Rock.Core.UnitTests.csproj | 10 +++ Rock.Core.UnitTests/packages.config | 1 + Rock.Core.sln | 6 ++ .../ModuleInitializer.cs | 43 ++++++------ 16 files changed, 313 insertions(+), 19 deletions(-) create mode 100644 Rock.Core.IntegrationTests/AssemblyInitialization/ModuleInitializer.cs create mode 100644 Rock.Core.ModuleInitializer.UnitTestSupport/AssemblyInitialization/FrameworkInitializerTestHelper.cs create mode 100644 Rock.Core.ModuleInitializer.UnitTestSupport/AssemblyInitialization/ModuleInitializer.cs create mode 100644 Rock.Core.ModuleInitializer.UnitTestSupport/AssemblyInitialization/Rock_Core_ModuleInitializer_UnitTestSupport_FrameworkInitializer.cs create mode 100644 Rock.Core.ModuleInitializer.UnitTestSupport/Properties/AssemblyInfo.cs create mode 100644 Rock.Core.ModuleInitializer.UnitTestSupport/Rock.Core.ModuleInitializer.UnitTestSupport.csproj create mode 100644 Rock.Core.ModuleInitializer.UnitTestSupport/packages.config create mode 100644 Rock.Core.UnitTests/AssemblyInitialization/ModuleInitializer.cs create mode 100644 Rock.Core.UnitTests/AssemblyInitialization/ModuleInitializerTests.cs create mode 100644 Rock.Core.UnitTests/AssemblyInitialization/Rock_Core_UnitTests_FrameworkInitializer.cs diff --git a/Rock.Core.IntegrationTests/AssemblyInitialization/ModuleInitializer.cs b/Rock.Core.IntegrationTests/AssemblyInitialization/ModuleInitializer.cs new file mode 100644 index 0000000..4c3d803 --- /dev/null +++ b/Rock.Core.IntegrationTests/AssemblyInitialization/ModuleInitializer.cs @@ -0,0 +1,14 @@ +namespace Rock.Core.IntegrationTests.AssemblyInitialization +{ + // NOTE: This module initializer exists only to ensure that the module initialization tests + // run successfully, even if the integration tests start first. NUnit seems to create a single + // app domain for all of its tests, so order is important. This is also the reason why this + // project references the unit test project. + internal static class ModuleInitializer + { + internal static void Run() + { + Rock.AssemblyInitialization.ModuleInitializer.Run(); + } + } +} \ No newline at end of file diff --git a/Rock.Core.IntegrationTests/Rock.Core.IntegrationTests.csproj b/Rock.Core.IntegrationTests/Rock.Core.IntegrationTests.csproj index ac8d9ac..e52b6d2 100644 --- a/Rock.Core.IntegrationTests/Rock.Core.IntegrationTests.csproj +++ b/Rock.Core.IntegrationTests/Rock.Core.IntegrationTests.csproj @@ -45,10 +45,19 @@ + + + {34d6b6ad-5725-469c-af77-eab7dbe61666} + Rock.Core.ModuleInitializer.UnitTestSupport + + + {6c71e326-e9b5-407e-889d-443311b0b22b} + Rock.Core.UnitTests + {0feb58cd-b15c-4cdc-83d6-7621c1db98c7} Rock.Core @@ -58,6 +67,9 @@ + + + + \ No newline at end of file diff --git a/Rock.Core.ModuleInitializer.UnitTestSupport/packages.config b/Rock.Core.ModuleInitializer.UnitTestSupport/packages.config new file mode 100644 index 0000000..db0de0b --- /dev/null +++ b/Rock.Core.ModuleInitializer.UnitTestSupport/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Rock.Core.UnitTests/AssemblyInitialization/ModuleInitializer.cs b/Rock.Core.UnitTests/AssemblyInitialization/ModuleInitializer.cs new file mode 100644 index 0000000..d4dec1a --- /dev/null +++ b/Rock.Core.UnitTests/AssemblyInitialization/ModuleInitializer.cs @@ -0,0 +1,10 @@ +namespace Rock.Core.UnitTests.AssemblyInitialization +{ + public static class ModuleInitializer + { + public static void Run() + { + global::Rock.AssemblyInitialization.ModuleInitializer.Run(); + } + } +} \ No newline at end of file diff --git a/Rock.Core.UnitTests/AssemblyInitialization/ModuleInitializerTests.cs b/Rock.Core.UnitTests/AssemblyInitialization/ModuleInitializerTests.cs new file mode 100644 index 0000000..859e499 --- /dev/null +++ b/Rock.Core.UnitTests/AssemblyInitialization/ModuleInitializerTests.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Rock.AssemblyInitialization; +using Rock.Core.ModuleInitializer.UnitTestSupport.AssemblyInitialization; + +namespace Rock.Core.UnitTests.AssemblyInitialization +{ + public class ModuleInitializerTests + { + [Test] + public void EachImplementorOfIFrameworkInitializerHasItsInitializeMethodInvokedOnce() + { + Assert.That(Rock_Core_UnitTests_FrameworkInitializer.InitializeInvocationCount, Is.EqualTo(1)); + Assert.That(Rock_Core_ModuleInitializer_UnitTestSupport_FrameworkInitializer.InitializeInvocationCount, Is.EqualTo(1)); + } + + /// + /// Verify that instances of the inheritors of are executed + /// in the correct order. The order should be such that an instance whose type's assembly + /// is referenced by the assembly of another instance's type in the list should be before those + /// other types. + /// + [Test] + public void ImplementorsOfFrameworkInitializerAreExecutedInAssemblyReferenceOrder() + { + Assert.That(FrameworkInitializerTestHelper.CalledFrameworkInitializerTypes, Is.EqualTo(TypesInAssemblyReferenceOrder)); + } + + /// + /// Get a collection of types, in "assembly reference" order. Since the assembly of + /// is referenced by + /// the assembly of , + /// is first, and + /// is second. + /// + private IEnumerable TypesInAssemblyReferenceOrder + { + get + { + yield return typeof(Rock_Core_ModuleInitializer_UnitTestSupport_FrameworkInitializer); + yield return typeof(Rock_Core_UnitTests_FrameworkInitializer); + } + } + } +} \ No newline at end of file diff --git a/Rock.Core.UnitTests/AssemblyInitialization/Rock_Core_UnitTests_FrameworkInitializer.cs b/Rock.Core.UnitTests/AssemblyInitialization/Rock_Core_UnitTests_FrameworkInitializer.cs new file mode 100644 index 0000000..03037d0 --- /dev/null +++ b/Rock.Core.UnitTests/AssemblyInitialization/Rock_Core_UnitTests_FrameworkInitializer.cs @@ -0,0 +1,22 @@ +using Rock.AssemblyInitialization; +using Rock.Core.ModuleInitializer.UnitTestSupport.AssemblyInitialization; + +namespace Rock.Core.UnitTests.AssemblyInitialization +{ + // ReSharper disable once InconsistentNaming + /// + /// This inheritor of IFrameworkInitializer counts the number of times any instance has its Initialize() method + /// invoked. It also registers the instance call with FrameworkInitializerTestHelper when its Initializer() + /// method is called. + /// + public class Rock_Core_UnitTests_FrameworkInitializer : IFrameworkInitializer + { + public void Initialize() + { + InitializeInvocationCount++; + FrameworkInitializerTestHelper.RegisterInitializeCall(GetType()); + } + + public static int InitializeInvocationCount { get; private set; } + } +} \ No newline at end of file diff --git a/Rock.Core.UnitTests/Rock.Core.UnitTests.csproj b/Rock.Core.UnitTests/Rock.Core.UnitTests.csproj index d1e1ff4..80b88b1 100644 --- a/Rock.Core.UnitTests/Rock.Core.UnitTests.csproj +++ b/Rock.Core.UnitTests/Rock.Core.UnitTests.csproj @@ -48,6 +48,7 @@ + @@ -62,20 +63,29 @@ + + + + {34d6b6ad-5725-469c-af77-eab7dbe61666} + Rock.Core.ModuleInitializer.UnitTestSupport + {0feb58cd-b15c-4cdc-83d6-7621c1db98c7} Rock.Core + + +