AbstractApplicationContextTests.cs :  » Inversion-of-Control-Dependency-Injection » Spring.net » Spring » Context » Support » C# / CSharp Open Source

Home
C# / CSharp Open Source
1.2.6.4 mono .net core
2.2.6.4 mono core
3.Aspect Oriented Frameworks
4.Bloggers
5.Build Systems
6.Business Application
7.Charting Reporting Tools
8.Chat Servers
9.Code Coverage Tools
10.Content Management Systems CMS
11.CRM ERP
12.Database
13.Development
14.Email
15.Forum
16.Game
17.GIS
18.GUI
19.IDEs
20.Installers Generators
21.Inversion of Control Dependency Injection
22.Issue Tracking
23.Logging Tools
24.Message
25.Mobile
26.Network Clients
27.Network Servers
28.Office
29.PDF
30.Persistence Frameworks
31.Portals
32.Profilers
33.Project Management
34.RSS RDF
35.Rule Engines
36.Script
37.Search Engines
38.Sound Audio
39.Source Control
40.SQL Clients
41.Template Engines
42.Testing
43.UML
44.Web Frameworks
45.Web Service
46.Web Testing
47.Wiki Engines
48.Windows Presentation Foundation
49.Workflows
50.XML Parsers
C# / C Sharp
C# / C Sharp by API
C# / CSharp Tutorial
C# / CSharp Open Source » Inversion of Control Dependency Injection » Spring.net 
Spring.net » Spring » Context » Support » AbstractApplicationContextTests.cs
#region License

/*
 * Copyright 2002-2005 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#endregion

#region Imports

using System;
using NUnit.Framework;
using Rhino.Mocks;
using Spring.Core;
using Spring.Core.IO;
using Spring.Objects;
using Spring.Objects.Events;
using Spring.Objects.Factory;
using Spring.Objects.Factory.Config;
using Spring.Objects.Factory.Support;
using Spring.Objects.Factory.Xml;

#endregion

namespace Spring.Context.Support{
  [TestFixture]
  public class AbstractApplicationContextTests
  {
    private MockApplicationContext _context;

    [SetUp]
    public void Init()
    {
      EverythingAwareObject.InstanceCount = 0;
      EverythingAwareObjectFactoryPostProcessor.InstanceCount = 0;
      EverythingAwareObjectPostProcessor.InstanceCount = 0;
      _context = new MockApplicationContext("MockApplicationContextName");
    }

    [TearDown]
    public void Destroy()
    {
      _context.Dispose();
      _context = null;
    }


        public void ContextAwareDisplayName()
        {
            
        }

#if NET_2_0
      [Test]
      public void ExecutesAllContextEventHandlersAndRethrowsExceptionsThrownDuringContextEventHandlingByDefault()
      {
          MockApplicationContext appCtx = new MockApplicationContext();
            bool secondHandlerExecuted = false;
            appCtx.ContextEvent += new ApplicationEventHandler(delegate(object sender, ApplicationEventArgs e)
            {
                throw new ApplicationException("dummy");
            } );
            appCtx.ContextEvent += new ApplicationEventHandler(delegate(object sender, ApplicationEventArgs e)
            {
                secondHandlerExecuted = true;
            } );


          ApplicationException resultException = null;
          try
          {
              appCtx.PublishEvent(this, new ApplicationEventArgs());
                Assert.Fail();
          }
          catch (ApplicationContextException e)
          {
              resultException = (ApplicationException) e.GetBaseException();
          }

            Assert.AreEqual("dummy", resultException.Message);
            Assert.IsTrue(secondHandlerExecuted);
        }
#endif

        [Test]
        public void DoesNotSearchParentContextForMessageSource()
        {
            MockRepository mocks = new MockRepository();
            IMessageSource msgSource = (IMessageSource) mocks.DynamicMock(typeof (IMessageSource));
            MockApplicationContext parentCtx = new MockApplicationContext("parentContext");
            parentCtx.ObjectFactory.RegisterSingleton(AbstractApplicationContext.MessageSourceObjectName, msgSource);
            MockApplicationContext childContext = new MockApplicationContext("childContext", parentCtx);
            parentCtx.Refresh();
            childContext.Refresh();

            Assert.AreNotSame( msgSource, childContext.MessageSource );
            Assert.AreSame(msgSource, parentCtx.MessageSource);
            Assert.AreEqual(msgSource, ((IHierarchicalMessageSource)childContext.MessageSource).ParentMessageSource);
        }

        [Test]
        public void DoesNotSearchParentContextForEventRegistry()
        {
            MockRepository mocks = new MockRepository();
            IEventRegistry eventRegistry = (IEventRegistry)mocks.DynamicMock(typeof(IEventRegistry));
            MockApplicationContext parentCtx = new MockApplicationContext("parentContext");
            parentCtx.ObjectFactory.RegisterSingleton(AbstractApplicationContext.EventRegistryObjectName, eventRegistry);
            MockApplicationContext childContext = new MockApplicationContext("childContext", parentCtx);
            parentCtx.Refresh();
            childContext.Refresh();

            Assert.AreSame( eventRegistry, parentCtx.EventRegistry );
            Assert.AreNotSame( eventRegistry, childContext.EventRegistry );
        }

    /// <summary>
    /// Tests the case where there is an object in the context with the name of the
    /// default message source name, that is NOT an IMessageSource.
    /// </summary>
    [Test]
    public void InvalidMessageSourceObject()
    {
      RootObjectDefinition def = new RootObjectDefinition(typeof (TestObject));
      ((DefaultListableObjectFactory) _context.ObjectFactory)
        .RegisterObjectDefinition(AbstractApplicationContext.MessageSourceObjectName, def);
      _context.Refresh();
      object foo = _context
        .GetObject(AbstractApplicationContext.MessageSourceObjectName);
      Assert.IsTrue(foo is ITestObject,
        "Registered non-IMessageSource object under the default message source name, but " +
        "failed to get it out of the context. Object retrieved is of type [ " + foo.GetType() + "].");
    }

    /// <summary>
    /// Tests the case where there is an object in the context with the name of the
    /// default event registry name, that is NOT an IEventRegistry.
    /// </summary>
    [Test]
    public void InvalidEventRegistryObject()
    {
      RootObjectDefinition def = new RootObjectDefinition(typeof (TestObject));
      ((DefaultListableObjectFactory) _context.ObjectFactory)
        .RegisterObjectDefinition(AbstractApplicationContext.EventRegistryObjectName, def);
      _context.Refresh();
      object foo = _context
        .GetObject(AbstractApplicationContext.EventRegistryObjectName);
      Assert.IsTrue(foo is ITestObject,
        "Registered non-IEventRegistry object under the default message source name, but " +
        "failed to get it out of the context. Object retrieved is of type [ " + foo.GetType() + "].");
    }

    [Test]
    public void ContextAwareSingletonWasCalledBack()
    {
      _context.RegisterSingleton();
      _context.Refresh();
      MockContextAwareObject mcao1 = (MockContextAwareObject)_context.GetObject("mcao-single");
      Assert.IsTrue(mcao1.ApplicationContext == _context, "context");
      object mcao2 = _context.GetObject("mcao-single");
      Assert.IsTrue(mcao1 == mcao2, "same");
      Assert.IsTrue(_context.IsSingleton("mcao-single"), "singleton?");
    }

    [Test]
    public void ContextAwarePrototypeWasCalledBack()
    {
      _context.RegisterObject();
      _context.Refresh();
      MockContextAwareObject mcao1 = (MockContextAwareObject)_context.GetObject("mcao-proto");
      Assert.IsTrue(mcao1.ApplicationContext == _context, "context");
      Assert.IsTrue(! _context.IsSingleton("mcao-proto"), "singleton");
      MockContextAwareObject mcao2 = (MockContextAwareObject) _context.GetObject("mcao-proto");
      Assert.IsTrue(mcao1 != mcao2, "instance");

    }

    [Test]
    public void ContextAwareSingletonGetName()
    {
      _context.RegisterSingleton();
      _context.Refresh();
      MockContextAwareObject mcao1 = (MockContextAwareObject)_context.GetObject("mcao-single");
      Assert.AreEqual(mcao1.ApplicationContext.Name, "MockApplicationContextName");
    }

    [Test]
    public void ContextAwarePrototypeGetName()
    {
      _context.RegisterObject();
      _context.Refresh();
      MockContextAwareObject mcao1 = (MockContextAwareObject)_context.GetObject("mcao-proto");
      Assert.AreEqual(mcao1.ApplicationContext.Name, "MockApplicationContextName");
    }

    [Test]
    public void ParentNull()
    {
      Assert.IsNull(_context.ParentContext, "parent is not null");
    }

    [Test]
    public void ParentNotNullGrandparentNull()
    {
      IApplicationContext parentContext = new MockApplicationContext("MockApplicationContextParent");
      _context = new MockApplicationContext("MockApplicationContextName", parentContext);
      Assert.IsNotNull(_context.ParentContext, "parent is null");
      Assert.IsNull(_context.ParentContext.ParentContext, "parent is null");
    }

    #region OrderOfKnownProcessorInterfaces Utility Classes

    public enum ObjectProcessingState
    {
      SetObjectName,
      SetObjectFactory,
      SetApplicationContext,
      PostProcessObjectFactory,
      ObjectPostProcessorBeforeInitialization,
      ObjectPostProcessorAfterInitialization,
    }

    public class EverythingAwareObject :
      IObjectNameAware,
      IObjectFactoryAware,
      IApplicationContextAware
    {
      public static int InstanceCount = 0;

      private ObjectProcessingState currentState;

      public EverythingAwareObject()
      {
        InstanceCount++;
      }

      public EverythingAwareObject(int expectObjectPostProcessorInstances)
        :this()
      {
        // ensure postprocessor has been instantiated *before* this object
        Assert.AreEqual(expectObjectPostProcessorInstances, EverythingAwareObjectPostProcessor.InstanceCount);
      }

      public ObjectProcessingState CurrentState
      {
        get { return currentState;}
        set { currentState = value; }
      }

      public IApplicationContext ApplicationContext
      {
        get { throw new NotImplementedException(); }
        set
        {
          Assert.AreEqual(ObjectProcessingState.SetApplicationContext, this.CurrentState);
          this.CurrentState++;
        }
      }

      public string ObjectName
      {
        set
        {
          Assert.AreEqual(ObjectProcessingState.SetObjectName, this.CurrentState);
          this.CurrentState++;
        }
      }

        private bool objectFactorySet = false;
      public IObjectFactory ObjectFactory
      {
        set
        {
                    // ignore multiple calls (due to OF also set during AbstractObjectFactory.AddObjectPostProcessor())
                    if (objectFactorySet)
                    {
                        return;
                    }
            objectFactorySet = true;
          Assert.AreEqual(ObjectProcessingState.SetObjectFactory, this.CurrentState);
          this.CurrentState++;
        }
      }
    }

    public class EverythingAwareObjectFactoryPostProcessor : EverythingAwareObject,
      IObjectFactoryPostProcessor
    {
      public new static int InstanceCount = 0;

      public EverythingAwareObjectFactoryPostProcessor()
      {
        InstanceCount++;
      }

      public void PostProcessObjectFactory(IConfigurableListableObjectFactory factory)
      {
        Assert.AreEqual(ObjectProcessingState.PostProcessObjectFactory, CurrentState);
        CurrentState++;
      }
    }

    public class EverythingAwareObjectPostProcessor : EverythingAwareObjectFactoryPostProcessor,
      IObjectPostProcessor
    {
      public new static int InstanceCount = 0;

      public EverythingAwareObjectPostProcessor()
      {
        InstanceCount++;
      }

      public EverythingAwareObjectPostProcessor(int expectObjectFactoryPostProcessorInstances)
        :this()
      {
        // ensure factorypostprocessor has been instantiated *before* this object
        Assert.AreEqual(expectObjectFactoryPostProcessorInstances, EverythingAwareObjectFactoryPostProcessor.InstanceCount);
      }

      public object PostProcessBeforeInitialization(object instance, string name)
      {
        Assert.AreNotEqual(this, instance);
        Assert.AreEqual(ObjectProcessingState.ObjectPostProcessorBeforeInitialization, CurrentState);
        CurrentState++;
        return instance;
      }

      public object PostProcessAfterInitialization(object instance, string objectName)
      {
        Assert.AreNotEqual(this, instance);
        Assert.AreEqual(ObjectProcessingState.ObjectPostProcessorAfterInitialization, CurrentState);
        CurrentState++;
        return instance;
      }
    }

    #endregion

    [Test]
    public void OrderOfKnownProcessorInterfaces()
    {
      DefaultListableObjectFactory objectFactory = (DefaultListableObjectFactory)this._context.ObjectFactory;
      RootObjectDefinition def;
      def = new RootObjectDefinition(typeof(EverythingAwareObjectPostProcessor));
      objectFactory.RegisterObjectDefinition("everythingAwareObjectPostProcessor", def);
      _context.Refresh();
    }

    [Test]
    public void OrderOfKnownProcessorInstantiation()
    {
      DefaultListableObjectFactory objectFactory = (DefaultListableObjectFactory)this._context.ObjectFactory;
      RootObjectDefinition def;
      // note the order of registration (checks instantiation does not occur in order of registration)
      def = new RootObjectDefinition(typeof(EverythingAwareObject));
      def.ConstructorArgumentValues.AddIndexedArgumentValue(0, 1);
      objectFactory.RegisterObjectDefinition("everythingAwareObject", def);
      def = new RootObjectDefinition(typeof(EverythingAwareObjectPostProcessor));
      def.ConstructorArgumentValues.AddIndexedArgumentValue(0, 1);
      objectFactory.RegisterObjectDefinition("everythingAwareObjectPostProcessor", def);
      def = new RootObjectDefinition(typeof(EverythingAwareObjectFactoryPostProcessor));
      objectFactory.RegisterObjectDefinition("everythingAwareObjectFactoryPostProcessor", def);
      _context.Refresh();
    }

    [Test]
    public void DefaultObjectFactoryProcessorsDontGetAddedTwice()
    {
      MockApplicationContext myContext = new MockApplicationContext("myContext");
      DefaultListableObjectFactory objectFactory = (DefaultListableObjectFactory)myContext.ObjectFactory;
      Assert.AreEqual(0, objectFactory.ObjectPostProcessorCount);
      myContext.Refresh();
      int defaultProcessors = objectFactory.ObjectPostProcessors.Count;
      myContext.Refresh();
      Assert.AreEqual(defaultProcessors, objectFactory.ObjectPostProcessors.Count);
    }

        [Test]
        public void ThrowsCannotLoadObjectTypeExceptionOnInvalidTypename()
        {
          try
          {
            MockApplicationContext myContext = new MockApplicationContext("myContext");
            DefaultListableObjectFactory objectFactory = (DefaultListableObjectFactory)myContext.ObjectFactory;
            XmlObjectDefinitionReader reader = new XmlObjectDefinitionReader(objectFactory);
            reader.LoadObjectDefinitions(new StringResource(
                                           @"<?xml version='1.0' encoding='UTF-8' ?>
<objects xmlns='http://www.springframework.net'>  
  <object id='test2' type='DOESNOTEXIST' />
</objects>
"));      
            myContext.Refresh();
          }
          catch (Exception e)
          {
//            Console.WriteLine(e);
            Assert.IsInstanceOf(typeof(CannotLoadObjectTypeException), e);
          }
        }
  }
}
www.java2v.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.