< Summary

Class:Willykc.Templ.Editor.Scaffold.TemplScaffoldNode
Assembly:Willykc.Templ.Editor
File(s):/github/workspace/Packages/package.to.test/Editor/Scaffold/TemplScaffoldNode.cs
Covered lines:52
Uncovered lines:4
Coverable lines:56
Total lines:135
Line coverage:92.8% (52 of 56)
Covered branches:0
Total branches:0
Covered methods:18
Total methods:18
Method coverage:100% (18 of 18)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
TemplScaffoldNode()0%110100%
RemoveChild(...)0%110100%
InsertChildrenRange(...)0%330100%
AddChild(...)0%2.092071.43%
AddChildrenRange(...)0%330100%
Clone()0%220100%
ContainsTemplate(...)0%330100%
SwitchParent(...)0%2.092071.43%
CloneRecursive(...)0%110100%

File(s)

/github/workspace/Packages/package.to.test/Editor/Scaffold/TemplScaffoldNode.cs

#LineLine coverage
 1/*
 2 * Copyright (c) 2024 Willy Alberto Kuster
 3 *
 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
 5 * of this software and associated documentation files (the "Software"), to deal
 6 * in the Software without restriction, including without limitation the rights
 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 8 * copies of the Software, and to permit persons to whom the Software is
 9 * furnished to do so, subject to the following conditions:
 10 *
 11 * The above copyright notice and this permission notice shall be included in
 12 * all copies or substantial portions of the Software.
 13 *
 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 20 * THE SOFTWARE.
 21 */
 22using System;
 23using System.Collections.Generic;
 24using System.Linq;
 25using UnityEngine;
 26
 27namespace Willykc.Templ.Editor.Scaffold
 28{
 29    [Serializable]
 30    internal abstract class TemplScaffoldNode
 31    {
 32        internal const string NameOfName = nameof(name);
 33        internal const string NameOfChildren = nameof(children);
 34
 35        [SerializeField]
 36        internal string name;
 37        [SerializeReference]
 36438        private List<TemplScaffoldNode> children = new List<TemplScaffoldNode>();
 39        [SerializeReference]
 40        private TemplScaffoldNode parent;
 41
 33542        internal IReadOnlyList<TemplScaffoldNode> Children => children;
 10143        internal TemplScaffoldNode Parent => parent;
 5644        internal string NodePath => parent == null ? name : $"{parent.NodePath}/{name}";
 24545        internal int NodeCount => children.Sum(c => c.NodeCount) + 1;
 31646        internal string RenderedName { get; set; }
 47
 48        internal bool IsValid =>
 3449            IsValidNode &&
 50            !IsNameDuplicated &&
 51            name.IsValidFileName() &&
 352            children.All(c => c.IsValid);
 53
 3154        protected virtual bool IsValidNode => true;
 55
 56        private bool IsNameDuplicated =>
 3557            parent?.children.Any(c => c != this && c.name == name) ?? false;
 58
 59        internal void RemoveChild(TemplScaffoldNode node) =>
 460            children.Remove(node);
 61
 62        internal void InsertChildrenRange(int insertIndex, IEnumerable<TemplScaffoldNode> nodes)
 263        {
 1064            foreach (var child in nodes)
 265            {
 266                child.SwitchParent(this);
 267            }
 68
 269            children.InsertRange(insertIndex, nodes);
 270        }
 71
 72        internal void AddChild(TemplScaffoldNode node)
 8073        {
 8074            if (!IsValidChild(node))
 075            {
 076                throw new InvalidOperationException(
 77                    $"{node.GetType().Name} can not be a child of {GetType().Name}");
 78            }
 79
 8080            children.Add(node);
 8081            node.parent = this;
 8082        }
 83
 84        internal void AddChildrenRange(IEnumerable<TemplScaffoldNode> children)
 3285        {
 18686            foreach (var child in children)
 4587            {
 4588                AddChild(child);
 4589            }
 3290        }
 91
 92        internal TemplScaffoldNode Clone()
 293        {
 294            var clone = CloneRecursive(this, parent);
 295            parent?.children.Add(clone);
 296            return clone;
 297        }
 98
 99        internal bool ContainsTemplate(ScribanAsset template)
 2100        {
 2101            if (this is TemplScaffoldFile fileNode && fileNode.Template == template)
 1102            {
 1103                return true;
 104            }
 105
 2106            return children.Any(c => c.ContainsTemplate(template));
 2107        }
 108
 109        protected abstract bool IsValidChild(TemplScaffoldNode value);
 110        protected abstract TemplScaffoldNode DoClone();
 111
 112        private void SwitchParent(TemplScaffoldNode newParent)
 2113        {
 2114            if (!newParent.IsValidChild(this))
 0115            {
 0116                throw new InvalidOperationException(
 117                    $"{GetType().Name} can not be a child of {newParent.GetType().Name}");
 118            }
 119
 2120            parent.RemoveChild(this);
 2121            parent = newParent;
 2122        }
 123
 124        private TemplScaffoldNode CloneRecursive(
 125            TemplScaffoldNode original,
 126            TemplScaffoldNode parent)
 3127        {
 3128            var clone = DoClone();
 3129            clone.name = original.name;
 3130            clone.parent = parent;
 4131            clone.children.AddRange(original.children.Select(c => c.CloneRecursive(c, clone)));
 3132            return clone;
 3133        }
 134    }
 135}