< Summary

Information
Class: MyNet.Observable.Behaviors.MetadataBehaviorApplicator
Assembly: MyNet.Observable
File(s): https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.Observable/Behaviors/MetadataBehaviorApplicator.cs
Tag: 323_28699572109
Line coverage
96%
Covered lines: 30
Uncovered lines: 1
Coverable lines: 31
Total lines: 82
Line coverage: 96.7%
Branch coverage
83%
Covered branches: 15
Total branches: 18
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
Apply(...)83.33%181895%
ApplyForwardProperty(...)100%11100%
ReplaceForwardingBehavior(...)100%11100%

File(s)

https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.Observable/Behaviors/MetadataBehaviorApplicator.cs

#LineLine coverage
 1// -----------------------------------------------------------------------
 2// <copyright file="MetadataBehaviorApplicator.cs" company="Stéphane ANDRE">
 3// Copyright (c) Stéphane ANDRE. All rights reserved.
 4// </copyright>
 5// -----------------------------------------------------------------------
 6
 7using System;
 8using System.Runtime.CompilerServices;
 9using MyNet.Globalization.Facade;
 10using MyNet.Metadata;
 11using MyNet.Observable.Behaviors.Metadata;
 12using MyNet.Observable.Behaviors.Metadata.Features;
 13using MyNet.Observable.Behaviors.Metadata.Features.Events;
 14
 15namespace MyNet.Observable.Behaviors;
 16
 17/// <summary>
 18/// Applies runtime behaviors declared in <see cref="MetadataRegistry"/> to <see cref="ObservableObject"/> instances.
 19/// </summary>
 20public static class MetadataBehaviorApplicator
 21{
 922    private static readonly ConditionalWeakTable<ObservableObject, object?> AppliedOwners = [];
 23
 24    /// <summary>
 25    /// Applies metadata-driven behaviors for the owner instance (currently property-changed forwarding).
 26    /// </summary>
 27    public static void Apply(ObservableObject owner)
 28    {
 193529        if (AppliedOwners.TryGetValue(owner, out _))
 030            return;
 31
 193532        AppliedOwners.Add(owner, null);
 33
 193534        var needsCulture = false;
 193535        var needsTimeZone = false;
 36
 1479637        for (var current = owner.GetType(); current is not null && typeof(ObservableObject).IsAssignableFrom(current); c
 38        {
 546339            var typeMetadata = MetadataRegistry.Get(current);
 40
 1097441            foreach (var propertyName in typeMetadata.WithFeature<PropertyChangedForwardingFeature>())
 42            {
 2443                var feature = typeMetadata.GetFeatureOrDefault<PropertyChangedForwardingFeature>(propertyName);
 2444                if (feature is null)
 45                    continue;
 46
 2447                ReplaceForwardingBehavior(owner, propertyName, feature.ConcatenatePropertyName);
 48            }
 49
 546350            if (!needsCulture)
 543951                needsCulture = typeMetadata.WithFeature<EventReactionFeature>(x => x.Events.Contains(typeof(CultureChang
 52
 546353            if (!needsTimeZone)
 546054                needsTimeZone = typeMetadata.WithFeature<EventReactionFeature>(x => x.Events.Contains(typeof(TimeZoneCha
 55        }
 56
 193557        if (needsCulture)
 2458            owner.ReactOnCultureChanged(GlobalizationServices.Current);
 59
 193560        if (needsTimeZone)
 361            owner.ReactOnTimeZoneChanged(GlobalizationServices.Current);
 193562    }
 63
 64    /// <summary>
 65    /// Registers forwarding for a single property and records it in metadata when not already configured.
 66    /// </summary>
 67    public static void ApplyForwardProperty(ObservableObject owner, string propertyName, bool concatenatePropertyName = 
 68    {
 1869        ArgumentNullException.ThrowIfNull(owner);
 1870        ArgumentException.ThrowIfNullOrWhiteSpace(propertyName);
 71
 1872        var propertyMetadata = MetadataRegistry.Get(owner.GetType()).GetProperty(propertyName);
 1873        MetadataApplicators.ApplyForwardProperty(propertyMetadata, concatenatePropertyName);
 1874        ReplaceForwardingBehavior(owner, propertyName, concatenatePropertyName);
 1875    }
 76
 4277    private static void ReplaceForwardingBehavior(ObservableObject owner, string propertyName, bool concatenatePropertyN
 4278        new PropertyChangedForwardingBehavior(owner, propertyName, concatenatePropertyName),
 4279        propertyName,
 4280        nameof(PropertyChangedForwardingBehavior));
 81}
 82