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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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>());
        }