コード例 #1
0
    public async Task NoDiagnostics_ChainOf3()
    {
        var hostPropertyTypeInfo = new EmptyClassBuilder()
                                   .WithClassName("ClassName")
                                   .WithNamespace("Namespace1")
                                   .WithClassAccess(Accessibility.Public);
        var hostTypeInfo = WhenChangedHostBuilder.Changing()
                           .WithClassName("ClassName")
                           .WithNamespace("Namespace2")
                           .WithInvocation(InvocationKind.MemberAccess, x => x.Child.Child.Value)
                           .WithClassAccess(Accessibility.Public)
                           .WithPropertyType(hostPropertyTypeInfo)
                           .WithPropertyAccess(Accessibility.Public);

        var fixture = await WhenChangedFixture.Create(hostTypeInfo, x => TestContext.WriteLine(x), ("HostProperty.cs", hostPropertyTypeInfo.BuildRoot())).ConfigureAwait(false);

        fixture.RunGenerator(out var compilationDiagnostics, out var generatorDiagnostics);

        generatorDiagnostics.Where(x => x.Severity >= DiagnosticSeverity.Warning).Should().BeEmpty();
        compilationDiagnostics.Where(x => x.Severity >= DiagnosticSeverity.Warning).Should().BeEmpty();

        var host = fixture.NewHostInstance();

        host.Child             = fixture.NewHostInstance();
        host.Child.Child       = fixture.NewHostInstance();
        host.Child.Child.Value = fixture.NewValuePropertyInstance();
        var observable = host.GetWhenChangedObservable(_ => TestContext.WriteLine(fixture.Sources));

        object emittedValue = null;

        observable.Subscribe(x => emittedValue = x);

        var initialValue = host.Child.Child.Value;

        emittedValue.Should().Be(initialValue);
        var previousValue = emittedValue;

        // According to the current design, no emission should occur when the chain is "broken".
        host.Child = null;
        emittedValue.Should().Be(previousValue);
        previousValue = emittedValue;

        host.Child       = fixture.NewHostInstance();
        host.Child.Child = fixture.NewHostInstance();
        emittedValue.Should().Be(previousValue);
        previousValue = emittedValue;

        host.Child.Child.Value = fixture.NewValuePropertyInstance();
        emittedValue.Should().Be(previousValue);
        previousValue = emittedValue;

        host.Child.Child.Value = null;
        emittedValue.Should().Be(previousValue);
    }
コード例 #2
0
    public async Task NoDiagnostics_PrivateHostPropertyTypeAndInternalOutputType()
    {
        var hostPropertyTypeInfo = new EmptyClassBuilder()
                                   .WithClassAccess(Accessibility.Private);
        var customType = new EmptyClassBuilder()
                         .WithClassName("Output")
                         .WithClassAccess(Accessibility.Internal);
        var hostTypeInfo = WhenChangedHostBuilder.Changing()
                           .WithClassName("HostClass")
                           .WithInvocation(InvocationKind.MemberAccess, x => x.Child, x => x.Value, "(a, b) => b != null ? new HostContainer.Output() : null")
                           .WithClassAccess(Accessibility.Protected)
                           .AddNestedClass(hostPropertyTypeInfo)
                           .WithPropertyType(hostPropertyTypeInfo)
                           .WithPropertyAccess(Accessibility.Private);
        var hostContainerTypeInfo = new EmptyClassBuilder()
                                    .WithClassName("HostContainer")
                                    .WithClassAccess(Accessibility.Public)
                                    .AddNestedClass(hostTypeInfo)
                                    .AddNestedClass(customType);

        var fixture = await WhenChangedFixture.Create(hostTypeInfo, x => TestContext.WriteLine(x)).ConfigureAwait(false);

        fixture.RunGenerator(out var compilationDiagnostics, out var generatorDiagnostics);

        generatorDiagnostics.Where(x => x.Severity >= DiagnosticSeverity.Warning).Should().BeEmpty();
        compilationDiagnostics.Where(x => x.Severity >= DiagnosticSeverity.Warning).Should().BeEmpty();

        var host = fixture.NewHostInstance();

        host.Value = fixture.NewValuePropertyInstance();
        var observable = host.GetWhenChangedObservable(_ => TestContext.WriteLine(fixture.Sources));

        object emittedValue = null;

        observable.Subscribe(x => emittedValue = x);

        // TODO: Better series of checks. Currently can't compare values because of reference
        // equality and we don't have access to the instance that the conversionFunc creates.
        emittedValue.Should().NotBeNull();
        host.Value = null;
        emittedValue.Should().NotBeNull();
        host.Value = fixture.NewValuePropertyInstance();
        emittedValue.Should().BeNull();
    }
    public async Task NoDiagnostics_InstanceReceiverKind(InvocationKind invocationKind)
    {
        var receiverPropertyTypeInfo = new EmptyClassBuilder()
                                       .WithClassAccess(Accessibility.Public);
        var externalReceiverTypeInfo = new WhenChangedHostBuilder()
                                       .WithClassName("ReactiveType")
                                       .WithClassAccess(Accessibility.Public)
                                       .WithPropertyType(receiverPropertyTypeInfo)
                                       .WithPropertyAccess(Accessibility.Public)
                                       .WithInvocation("null");
        var hostTypeInfo = new WhenChangedHostBuilder()
                           .WithClassName("HostClass")
                           .WithClassAccess(Accessibility.Public)
                           .WithInvocation(invocationKind, x => x.Value, externalReceiverTypeInfo);

        var fixture = await WhenChangedFixture.Create(hostTypeInfo, externalReceiverTypeInfo, x => TestContext.WriteLine(x), ("ReceiverPropertyTypeInfo.cs", receiverPropertyTypeInfo.BuildRoot())).ConfigureAwait(false);

        fixture.RunGenerator(out var compilationDiagnostics, out var generatorDiagnostics);

        generatorDiagnostics.Where(x => x.Severity >= DiagnosticSeverity.Warning).Should().BeEmpty();
        compilationDiagnostics.Where(x => x.Severity >= DiagnosticSeverity.Warning).Should().BeEmpty();

        var host     = fixture.NewHostInstance();
        var receiver = fixture.NewReceiverInstance();

        host.Receiver  = receiver;
        receiver.Value = fixture.NewValuePropertyInstance();
        var    observable = host.GetWhenChangedObservable(_ => TestContext.WriteLine(fixture.Sources));
        object value      = null;

        observable.Subscribe(x => value = x);
        receiver.Value.Should().Equals(value);
        receiver.Value = fixture.NewValuePropertyInstance();
        receiver.Value.Should().Equals(value);
        receiver.Value = null;
        receiver.Value.Should().Equals(value);
    }
    private async Task AssertTestCase_SingleExpression(WhenChangedHostBuilder hostTypeInfo, BaseUserSourceBuilder hostPropertyTypeInfo, bool typesHaveSameRoot)
    {
        hostTypeInfo.WithInvocation(InvocationKind.MemberAccess, x => x.Value);
        var propertyTypeSource = typesHaveSameRoot ? string.Empty : hostPropertyTypeInfo.BuildRoot();
        var fixture            = await WhenChangedFixture.Create(hostTypeInfo, x => TestContext.WriteLine(x), ("PropertyTypeSource.cs", propertyTypeSource)).ConfigureAwait(false);

        fixture.RunGenerator(out var compilationDiagnostics, out var generatorDiagnostics);

        generatorDiagnostics.Where(x => x.Severity >= DiagnosticSeverity.Warning).Should().BeEmpty();
        compilationDiagnostics.Where(x => x.Severity >= DiagnosticSeverity.Warning).Should().BeEmpty();

        var host = fixture.NewHostInstance();

        host.Value = fixture.NewValuePropertyInstance();
        var    observable = host.GetWhenChangedObservable(_ => TestContext.WriteLine(fixture.Sources));
        object value      = null;

        observable.Subscribe(x => value = x);
        host.Value.Should().Be(value);
        host.Value = fixture.NewValuePropertyInstance();
        host.Value.Should().Be(value);
        host.Value = null;
        host.Value.Should().Be(value);
    }