< Summary

Class:Willykc.Templ.Editor.Scaffold.TemplScaffold
Assembly:Willykc.Templ.Editor
File(s):/github/workspace/Packages/package.to.test/Editor/Scaffold/TemplScaffold.cs
Covered lines:84
Uncovered lines:0
Coverable lines:84
Total lines:179
Line coverage:100% (84 of 84)
Covered branches:0
Total branches:0
Covered methods:14
Total methods:14
Method coverage:100% (14 of 14)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
TemplScaffold()0%110100%
TemplScaffold()0%110100%
Reset()0%220100%
AddScaffoldFileNodes(...)0%550100%
AddScaffoldDirectoryNodes(...)0%550100%
RemoveScaffoldNodes(...)0%550100%
MoveScaffoldNodes(...)0%10100100%
CloneScaffoldNodes(...)0%660100%
ContainsTemplate(...)0%110100%
GetNewRoot()0%110100%
AddNode[T](...)0%220100%

File(s)

/github/workspace/Packages/package.to.test/Editor/Scaffold/TemplScaffold.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    [CreateAssetMenu(fileName = NewPrefix + nameof(TemplScaffold), menuName = MenuName, order = 2)]
 30    public class TemplScaffold : ScriptableObject
 31    {
 32        internal const string NameOfDefaultInput = nameof(defaultInput);
 33        internal const string NameOfRoot = nameof(root);
 34
 35        protected const string NewPrefix = "New";
 36
 37        private const string MenuName = "Templ/Scaffold Definition";
 38        private const string DefaultFileName = NewPrefix + "File";
 39        private const string DefaultDirectoryName = NewPrefix + "Directory";
 40
 141        private static readonly List<TemplScaffoldNode> EmptyList = new List<TemplScaffoldNode>(0);
 42
 43        internal event Action AfterReset;
 44        internal event Action<IReadOnlyList<TemplScaffoldNode>> Changed;
 45
 46        [SerializeField]
 47        protected ScriptableObject defaultInput;
 48        [SerializeReference]
 13049        private TemplScaffoldRoot root = GetNewRoot();
 50
 51        /// <summary>
 52        /// Default input instance.
 53        /// </summary>
 2354        public ScriptableObject DefaultInput => defaultInput;
 55
 12456        internal virtual TemplScaffoldRoot Root => root;
 3157        internal virtual bool IsValid => root.IsValid;
 58
 59        protected void Reset()
 12160        {
 12161            root = GetNewRoot();
 12162            defaultInput = null;
 12163            AfterReset?.Invoke();
 12164        }
 65
 66        internal void AddScaffoldFileNodes(TemplScaffoldNode[] nodes)
 1667        {
 1668            nodes = nodes ?? throw new ArgumentNullException(nameof(nodes));
 1669            if (nodes.Length == 0)
 1070            {
 1071                nodes = new[] { root };
 1072            }
 1673            var newNodes = nodes
 1674                .Select(n => AddNode<TemplScaffoldFile>(n, DefaultFileName))
 75                .ToList();
 1676            Changed?.Invoke(newNodes);
 1677        }
 78
 79        internal void AddScaffoldDirectoryNodes(TemplScaffoldNode[] nodes)
 1980        {
 1981            nodes = nodes ?? throw new ArgumentNullException(nameof(nodes));
 1982            if (nodes.Length == 0)
 1883            {
 1884                nodes = new[] { root };
 1885            }
 1986            var newNodes = nodes
 1987                .Select(n => AddNode<TemplScaffoldDirectory>(n, DefaultDirectoryName))
 88                .ToList();
 1989            Changed?.Invoke(newNodes);
 1990        }
 91
 92        internal void RemoveScaffoldNodes(TemplScaffoldNode[] nodes)
 293        {
 294            nodes = nodes ?? throw new ArgumentNullException(nameof(nodes));
 1095            foreach (var node in nodes)
 296            {
 297                node.Parent?.RemoveChild(node);
 298            }
 299            Changed?.Invoke(EmptyList);
 2100        }
 101
 102        internal void MoveScaffoldNodes(
 103            TemplScaffoldNode parent,
 104            int insertIndex,
 105            TemplScaffoldNode[] draggedNodes)
 7106        {
 7107            parent ??= root;
 7108            if (draggedNodes == null || draggedNodes.Length == 0)
 1109            {
 1110                return;
 111            }
 112
 6113            if (insertIndex < 0)
 1114            {
 1115                throw new ArgumentException($"Invalid input: {nameof(insertIndex)} " +
 116                    "must not be negative");
 117            }
 118
 5119            var isRootDragged = draggedNodes
 5120                .Any(n => n is TemplScaffoldRoot);
 5121            if (isRootDragged)
 1122            {
 1123                throw new InvalidOperationException("Scaffold root node can not be reparented");
 124            }
 125
 4126            if (parent is TemplScaffoldFile)
 1127            {
 1128                throw new InvalidOperationException("Scaffold File nodes can not be parent nodes");
 129            }
 130
 3131            if (insertIndex > 0)
 2132            {
 2133                var subSet = new TemplScaffoldNode[insertIndex];
 2134                Array.Copy(parent.Children.ToArray(), subSet, insertIndex);
 1135                insertIndex -= subSet.Count(draggedNodes.Contains);
 1136            }
 137
 2138            parent.InsertChildrenRange(insertIndex, draggedNodes);
 2139            Changed?.Invoke(draggedNodes);
 3140        }
 141
 142        internal void CloneScaffoldNodes(TemplScaffoldNode[] nodes)
 4143        {
 4144            if (nodes == null || nodes.Length == 0)
 1145            {
 1146                return;
 147            }
 3148            var clones = nodes
 3149                .Where(n => !(n is TemplScaffoldRoot))
 2150                .Select(n => n.Clone())
 151                .ToList();
 3152            Changed?.Invoke(clones);
 4153        }
 154
 155        internal virtual bool ContainsTemplate(ScribanAsset template) =>
 3156            root.Children.Any(c => c.ContainsTemplate(template));
 157
 158        private static TemplScaffoldRoot GetNewRoot() =>
 251159            new TemplScaffoldRoot() { name = nameof(Root) };
 160
 161        private static TemplScaffoldNode AddNode<T>(TemplScaffoldNode node, string name)
 162            where T : TemplScaffoldNode, new()
 35163        {
 35164            var current = node;
 35165            if (node is TemplScaffoldFile)
 1166            {
 1167                current = node.Parent;
 1168            }
 169
 35170            var newNode = new T()
 171            {
 172                name = name
 173            };
 174
 35175            current.AddChild(newNode);
 35176            return newNode;
 35177        }
 178    }
 179}