< Summary

Class:HierarchicalAgent
Assembly:bamlab.micromissiles
File(s):/github/workspace/Assets/Scripts/Hierarchical/HierarchicalAgent.cs
Covered lines:18
Uncovered lines:31
Coverable lines:49
Total lines:74
Line coverage:36.7% (18 of 49)
Covered branches:0
Total branches:0
Covered methods:9
Total methods:9
Method coverage:100% (9 of 9)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
HierarchicalAgent(...)0%110100%

File(s)

/github/workspace/Assets/Scripts/Hierarchical/HierarchicalAgent.cs

#LineLine coverage
 1using System;
 2using UnityEngine;
 3
 4// Hierarchy node owned by an agent.
 5//
 6// Since agents cannot inherit from both HierarchicalBase and MonoBehaviour, agents use composition
 7// to know their position within the hierarchical strategy.
 8[Serializable]
 9public class HierarchicalAgent : HierarchicalBase {
 10  // Agent to which this hierarchical node belongs.
 1792211  public IAgent Agent { get; init; }
 12
 377113  public override Vector3 Position => Agent.Position;
 261614  public override Vector3 Velocity => Agent.Velocity;
 166115  public override Vector3 Acceleration => Agent.Acceleration;
 699516  public override bool IsTerminated => Agent.IsTerminated;
 17
 18  public override IHierarchical Target {
 4874719    get { return base.Target; }
 95520    set {
 95521      if (base.Target != null) {
 022        if (Agent.IsPursuer) {
 23          // Remove the interceptor as a pursuer from all target sub-hierarchical objects.
 024          void RemovePursuerFromHierarchical(IHierarchical target) {
 025            target.RemovePursuer(this);
 026            foreach (var subHierarchical in target.SubHierarchicals) {
 027              RemovePursuerFromHierarchical(subHierarchical);
 028            }
 029          }
 030          RemovePursuerFromHierarchical(base.Target);
 031        } else {
 32          // For non-pursuable agents, such as launchers, only remove from the top-level target.
 033          base.Target.RemovePursuer(this);
 034        }
 035        ClearSubHierarchicals();
 036        Agent.DestroyTargetModel();
 037      }
 95538      base.Target = value;
 191039      if (base.Target != null) {
 40        // Threats also set their target to the asset, so we should also track the threats pursuing
 41        // the asset.
 95542        base.Target.AddPursuer(this);
 95543        if (Agent is IInterceptor interceptor) {
 44          // Subscribe to the target events.
 045          foreach (var targetHierarchical in Target.ActiveSubHierarchicals) {
 046            if (targetHierarchical is HierarchicalAgent targetAgent) {
 047              targetAgent.Agent.OnTerminated += (IAgent agent) =>
 048                  agent.HierarchicalAgent.RemoveTargetHierarchical(targetHierarchical);
 049            }
 050          }
 51
 52          // Perform recursive clustering on the new targets.
 053          RecursiveCluster(maxClusterSize: interceptor.CapacityPerSubInterceptor);
 54
 055          if (Agent.IsPursuer) {
 56            // Add the interceptor as a pursuer to all target sub-hierarchical objects.
 057            void AddPursuerToHierarchical(IHierarchical target) {
 058              target.AddPursuer(this);
 059              foreach (var subHierarchical in target.SubHierarchicals) {
 060                AddPursuerToHierarchical(subHierarchical);
 061              }
 062            }
 063            AddPursuerToHierarchical(base.Target);
 064          }
 065        }
 95566        Agent.CreateTargetModel(base.Target);
 95567      }
 95568    }
 69  }
 70
 193871  public HierarchicalAgent(IAgent agent) {
 96972    Agent = agent;
 96973  }
 74}