public void 深い階層の生成テスト() { const string source = @" using Aetos.ComparisonGenerator; namespace Aetos.ComparisonGenerator { namespace IntegrationTest { public partial class Outer { [Comparable] public partial class Inner { [CompareBy] public int Value { get; set; } } } } }"; var generator = new ComparableObjectGenerator(); var assembly = RunGeneratorAndGenerateAssembly( generator, source, out _); Assert.That(assembly, Is.Not.Null); var type = assembly.GetType("Aetos.ComparisonGenerator.IntegrationTest.Outer+Inner"); Assert.That(type, Is.Not.Null); }
public void IEquatableT_Equalsが非virtualで生成される() { const string source = @" using Aetos.ComparisonGenerator; [Comparable] public partial class Person { [CompareBy(Order = 0)] public string FirstName { get; set; } [CompareBy(Order = 1)] public string LastName { get; set; } }"; var options = new GenerateOptions( generateEquatable: true, generateMethodsAsVirtual: false); var generator = new ComparableObjectGenerator(options); var assembly = RunGeneratorAndGenerateAssembly( generator, source, out _); Assert.That(assembly, Is.Not.Null); var type = assembly.GetType("Person"); Assert.That(type, Is.Not.Null); var equals = GetMethod( type, "Equals", type); Assert.That(equals, Is.Not.Null); // インターフェイスの実装であるメソッドは明示的に virtual と書かなくても IsVirtual は True になる。 // 明示的に virtual と書いていない場合、IsFinal が True になり、オーバーライドできない。 Assert.That(equals.IsFinal, Is.True); }
public void IEquatableT_Equalsがvirtualで生成される() { const string source = @" using Aetos.ComparisonGenerator; [Comparable] public partial class Person { [CompareBy(Order = 0)] public string FirstName { get; set; } [CompareBy(Order = 1)] public string LastName { get; set; } }"; var options = new GenerateOptions( generateEquatable: true, generateMethodsAsVirtual: true); var generator = new ComparableObjectGenerator(options); var assembly = RunGeneratorAndGenerateAssembly( generator, source, out _); Assert.That(assembly, Is.Not.Null); var type = assembly.GetType("Person"); Assert.That(type, Is.Not.Null); var equals = GetMethod( type, "Equals", type); Assert.That(equals, Is.Not.Null); Assert.That(equals.IsFinal, Is.False); }
public void Object_Equalsが生成さない() { const string source = @" using Aetos.ComparisonGenerator; [Comparable] public partial class Person { [CompareBy(Order = 0)] public string FirstName { get; set; } [CompareBy(Order = 1)] public string LastName { get; set; } }"; var options = new GenerateOptions( overrideObjectMethods: false); var generator = new ComparableObjectGenerator(options); var assembly = RunGeneratorAndGenerateAssembly( generator, source, out _); Assert.That(assembly, Is.Not.Null); var type = assembly.GetType("Person"); Assert.That(type, Is.Not.Null); var equals = GetMethod( type, "Equals", typeof(object)); Assert.That(equals, Is.Null); }
public void Object_EqualsがIEquitableT_Equalsに移譲される() { const string source = @" using System; using Aetos.ComparisonGenerator; using Aetos.ComparisonGenerator.IntegrationTests.Injection; [Comparable] public partial class Person : IEquatable<Person> { private readonly ITestHooks _hooks; public Person( ITestHooks hooks) { this._hooks = hooks; } [CompareBy(Order = 0)] public string FirstName { get; set; } [CompareBy(Order = 1)] public string LastName { get; set; } bool IEquatable<Person>.Equals( Person? other) { return this._hooks.EqualsHook(this, other); } }"; var options = new GenerateOptions( overrideObjectMethods: true, generateEquatable: false); var generator = new ComparableObjectGenerator(options); var assembly = RunGeneratorAndGenerateAssembly( generator, source, out _); Assert.That(assembly, Is.Not.Null); var type = assembly.GetType("Person"); Assert.That(type, Is.Not.Null); var equals = GetMethod(type, "Equals", typeof(object)); Assert.That(equals, Is.Not.Null); var hook = Substitute.For <ITestHooks>(); var hook2 = new TestHooks(hook); var instance = Activator.CreateInstance(type, hook2); hook .EqualsHook(Arg.Any <object>(), Arg.Any <object>()) .Returns(true); var result = equals.Invoke(instance, new[] { instance }); Assert.That(result, Is.True); hook.Received().EqualsHook(Arg.Any <object>(), Arg.Any <object>()); }