< Summary

Class:HierarchicalAgent
Assembly:bamlab.micromissiles
File(s):/github/workspace/Assets/Scripts/Hierarchical/HierarchicalAgent.cs
Covered lines:4
Uncovered lines:45
Coverable lines:49
Total lines:74
Line coverage:8.1% (4 of 49)
Covered branches:0
Total branches:0
Covered methods:3
Total methods:9
Method coverage:33.3% (3 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.
 5711  public IAgent Agent { get; init; }
 12
 013  public override Vector3 Position => Agent.Position;
 014  public override Vector3 Velocity => Agent.Velocity;
 015  public override Vector3 Acceleration => Agent.Acceleration;
 016  public override bool IsTerminated => Agent.IsTerminated;
 17
 18  public override IHierarchical Target {
 019    get { return base.Target; }
 020    set {
 021      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      }
 038      base.Target = value;
 039      if (base.Target != null) {
 40        // Threats also set their target to the asset, so we should also track the threats pursuing
 41        // the asset.
 042        base.Target.AddPursuer(this);
 043        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        }
 066        Agent.CreateTargetModel(base.Target);
 067      }
 068    }
 69  }
 70
 5271  public HierarchicalAgent(IAgent agent) {
 2672    Agent = agent;
 2673  }
 74}