From 30445090f20191dc700c31b98a8519fb9663e1c8 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 4 Jul 2014 11:28:23 +1200 Subject: [PATCH] -DI tests --- .../Newtonsoft.Json.Tests.csproj | 4 + .../Serialization/DependencyInjectionTests.cs | 228 ++++++++++++++++++ Src/Newtonsoft.Json.Tests/packages.config | 1 + 3 files changed, 233 insertions(+) create mode 100644 Src/Newtonsoft.Json.Tests/Serialization/DependencyInjectionTests.cs diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj index 16bb1b9e..daad7435 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj @@ -30,6 +30,9 @@ 4 + + ..\packages\Autofac.3.5.0\lib\net40\Autofac.dll + False ..\packages\FSharp.Core.4.0.0\lib\FSharp.Core.dll @@ -241,6 +244,7 @@ + diff --git a/Src/Newtonsoft.Json.Tests/Serialization/DependencyInjectionTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/DependencyInjectionTests.cs new file mode 100644 index 00000000..ff642609 --- /dev/null +++ b/Src/Newtonsoft.Json.Tests/Serialization/DependencyInjectionTests.cs @@ -0,0 +1,228 @@ +#region License +// Copyright (c) 2007 James Newton-King +// +// 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. +#endregion + +using Autofac; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json.Tests.TestObjects; +#if !(NET35 || NET20) +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.FSharp.Collections; +using NUnit.Framework; + +namespace Newtonsoft.Json.Tests.Serialization +{ + public interface ITaskRepository + { + string ConnectionString { get; set; } + } + + public interface ILogger + { + DateTime DateTime { get; } + string Level { get; set; } + } + + public class TaskRepository : ITaskRepository + { + public string ConnectionString { get; set; } + } + + public class LogManager : ILogger + { + private readonly DateTime _dt; + + public LogManager(DateTime dt) + { + _dt = dt; + } + + public DateTime DateTime + { + get { return _dt; } + } + + public string Level { get; set; } + } + + public class TaskController + { + private readonly ITaskRepository _repository; + private readonly ILogger _logger; + + public TaskController(ITaskRepository repository, ILogger logger) + { + _repository = repository; + _logger = logger; + } + + public ITaskRepository Repository + { + get { return _repository; } + } + + public ILogger Logger + { + get { return _logger; } + } + } + + public class HasSettableProperty + { + public ILogger Logger { get; set; } + public ITaskRepository Repository { get; set; } + public IList People { get; set; } + public Person Person { get; set; } + + public HasSettableProperty(ILogger logger) + { + Logger = logger; + } + } + + public class AutofacContractResolver : DefaultContractResolver + { + private readonly IContainer _container; + + public AutofacContractResolver(IContainer container) + { + _container = container; + } + + protected override JsonObjectContract CreateObjectContract(Type objectType) + { + JsonObjectContract contract = base.CreateObjectContract(objectType); + + if (_container.IsRegistered(objectType)) + contract.DefaultCreator = () => _container.Resolve(objectType); + + return contract; + } + } + + [TestFixture] + public class DependencyInjectionTests : TestFixtureBase + { + [Test] + public void CreateObjectWithParameters() + { + int count = 0; + + ContainerBuilder builder = new ContainerBuilder(); + builder.RegisterType().As(); + builder.RegisterType(); + builder.Register(c => + { + count++; + return new LogManager(new DateTime(2000, 12, 12)); + }).As(); + + IContainer container = builder.Build(); + + AutofacContractResolver contractResolver = new AutofacContractResolver(container); + + TaskController controller = JsonConvert.DeserializeObject(@"{ + 'Logger': { + 'Level':'Debug' + } + }", new JsonSerializerSettings + { + ContractResolver = contractResolver + }); + + Assert.IsNotNull(controller); + Assert.IsNotNull(controller.Logger); + + Assert.AreEqual(1, count); + + Assert.AreEqual(new DateTime(2000, 12, 12), controller.Logger.DateTime); + Assert.AreEqual("Debug", controller.Logger.Level); + } + + [Test] + public void CreateObjectWithSettableParameter() + { + int count = 0; + + ContainerBuilder builder = new ContainerBuilder(); + builder.Register(c => + { + count++; + return new TaskRepository(); + }).As(); + builder.RegisterType(); + builder.Register(c => + { + count++; + return new LogManager(new DateTime(2000, 12, 12)); + }).As(); + + IContainer container = builder.Build(); + + AutofacContractResolver contractResolver = new AutofacContractResolver(container); + + HasSettableProperty o = JsonConvert.DeserializeObject(@"{ + 'Logger': { + 'Level': 'Debug' + }, + 'Repository': { + 'ConnectionString': 'server=.' + }, + 'People': [ + { + 'Name': 'Name1!' + }, + { + 'Name': 'Name2!' + } + ], + 'Person': { + 'Name': 'Name3!' + } + }", new JsonSerializerSettings + { + ContractResolver = contractResolver + }); + + Assert.IsNotNull(o); + Assert.IsNotNull(o.Logger); + Assert.IsNotNull(o.Repository); + + Assert.AreEqual(2, count); + + Assert.AreEqual(new DateTime(2000, 12, 12), o.Logger.DateTime); + Assert.AreEqual("Debug", o.Logger.Level); + Assert.AreEqual("server=.", o.Repository.ConnectionString); + Assert.AreEqual(2, o.People.Count); + Assert.AreEqual("Name1!", o.People[0].Name); + Assert.AreEqual("Name2!", o.People[1].Name); + Assert.AreEqual("Name3!", o.Person.Name); + } + } +} +#endif \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/packages.config b/Src/Newtonsoft.Json.Tests/packages.config index 792af049..3161c40a 100644 --- a/Src/Newtonsoft.Json.Tests/packages.config +++ b/Src/Newtonsoft.Json.Tests/packages.config @@ -1,5 +1,6 @@  +