LinerSortStrategy
This commit is contained in:
parent
5ec5d749c3
commit
2cba3e7e95
@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d7b935eca30945f5bff132d6a7645320
|
||||
timeCreated: 1605459681
|
@ -0,0 +1,22 @@
|
||||
using System.Linq;
|
||||
|
||||
namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort {
|
||||
public static class DependencyNodeExtensions {
|
||||
public static bool IsSourceEmpty(this IDependencyNode node) {
|
||||
return !node.Sources.Any();
|
||||
}
|
||||
public static bool IsDestinationEmpty(this IDependencyNode node) {
|
||||
return !node.Destinations.Any();
|
||||
}
|
||||
public static bool IsEmptyDependency(this IDependencyNode node) {
|
||||
return node.IsSourceEmpty() && node.IsDestinationEmpty();
|
||||
}
|
||||
public static int CountDependencies(this IDependencyNode node) {
|
||||
return node.Sources.Count + node.Destinations.Count;
|
||||
}
|
||||
public static bool ContainsSelfReference(this IDependencyNode node) {
|
||||
return node.Sources.Any(x => x == node.Profile) ||
|
||||
node.Destinations.Any(x => x == node.Profile);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8d0cee1bf7d4c8c47a98a23879a257cb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort {
|
||||
public interface ISortStrategy {
|
||||
IEnumerable<SortedNode> Sort(IEnumerable<IDependencyNode> nodes);
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3e2c63741aae4306aa49389ffdcb2e13
|
||||
timeCreated: 1605459681
|
@ -0,0 +1,31 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort {
|
||||
public class LinerSortStrategy : ISortStrategy {
|
||||
readonly Vector2 originPosition;
|
||||
readonly float basicDistance;
|
||||
readonly float nodeWidth;
|
||||
readonly float nodeHeight;
|
||||
|
||||
public LinerSortStrategy(Vector2 originPosition, float basicDistance, float nodeWidth, float nodeHeight) {
|
||||
this.originPosition = originPosition;
|
||||
this.basicDistance = basicDistance;
|
||||
this.nodeWidth = nodeWidth;
|
||||
this.nodeHeight = nodeHeight;
|
||||
}
|
||||
|
||||
IEnumerable<SortedNode> ISortStrategy.Sort(IEnumerable<IDependencyNode> nodes) {
|
||||
var arr = nodes.ToArray();
|
||||
var posDict = arr
|
||||
.ToDictionary(x => x.Profile, _ => originPosition);
|
||||
// 参照元がないNodeを原点に
|
||||
var left = arr.FirstOrDefault(x => x.IsSourceEmpty());
|
||||
posDict[left.Profile] = originPosition;
|
||||
var right = arr.FirstOrDefault(x => x.Profile != left.Profile);
|
||||
posDict[right.Profile] = new Vector2(nodeWidth / 2.0F + basicDistance, 0.0F) + originPosition;
|
||||
return posDict.Select(x => new SortedNode { Profile = x.Key, Position = x.Value });
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7d00de9a7b3041be922c457f9f53b1c0
|
||||
timeCreated: 1605459871
|
@ -0,0 +1,8 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort {
|
||||
public class SortedNode {
|
||||
public NodeProfile Profile { set; get; }
|
||||
public Vector2 Position { set; get; }
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c995f86b2ebe4c83ac65ec6727431ddb
|
||||
timeCreated: 1605459738
|
@ -0,0 +1,56 @@
|
||||
using System.Collections;
|
||||
using AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor;
|
||||
using UnityEngine.TestTools;
|
||||
|
||||
namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests {
|
||||
public class DependencyNodeExtensionsTest {
|
||||
|
||||
[SetUp]
|
||||
public void SetUpBeforeEveryTest() {
|
||||
Nodes.Init();
|
||||
// [0]--->[1]--->[2]<---[3] [4]
|
||||
Nodes._0.SetRequireNodes(new[] { Profiles._1 });
|
||||
Nodes._1.SetRequireNodes(new[] { Profiles._2 });
|
||||
Nodes._3.SetRequireNodes(new[] { Profiles._2 });
|
||||
NodeProcessor.SetBeRequiredNodes(new[] { Nodes._0, Nodes._1, Nodes._2, Nodes._3, Nodes._4 });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestIsSourceEmpty() {
|
||||
Assert.That(Nodes._0.IsSourceEmpty(), Is.True);
|
||||
Assert.That(Nodes._1.IsSourceEmpty(), Is.False);
|
||||
Assert.That(Nodes._2.IsSourceEmpty(), Is.False);
|
||||
Assert.That(Nodes._3.IsSourceEmpty(), Is.True);
|
||||
Assert.That(Nodes._4.IsSourceEmpty(), Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestIsDestinationEmpty() {
|
||||
Assert.That(Nodes._0.IsDestinationEmpty(), Is.False);
|
||||
Assert.That(Nodes._1.IsDestinationEmpty(), Is.False);
|
||||
Assert.That(Nodes._2.IsDestinationEmpty(), Is.True);
|
||||
Assert.That(Nodes._3.IsDestinationEmpty(), Is.False);
|
||||
Assert.That(Nodes._4.IsDestinationEmpty(), Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestIsEmptyDependency() {
|
||||
Assert.That(Nodes._0.IsEmptyDependency(), Is.False);
|
||||
Assert.That(Nodes._1.IsEmptyDependency(), Is.False);
|
||||
Assert.That(Nodes._2.IsEmptyDependency(), Is.False);
|
||||
Assert.That(Nodes._3.IsEmptyDependency(), Is.False);
|
||||
Assert.That(Nodes._4.IsEmptyDependency(), Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCountDependencies() {
|
||||
Assert.That(Nodes._0.CountDependencies(), Is.EqualTo(1));
|
||||
Assert.That(Nodes._1.CountDependencies(), Is.EqualTo(2));
|
||||
Assert.That(Nodes._2.CountDependencies(), Is.EqualTo(2));
|
||||
Assert.That(Nodes._3.CountDependencies(), Is.EqualTo(1));
|
||||
Assert.That(Nodes._4.CountDependencies(), Is.EqualTo(0));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 95cc92d669584f4bacd5faf7b1e78320
|
||||
timeCreated: 1605543283
|
@ -0,0 +1,43 @@
|
||||
using System.Collections;
|
||||
using System.Linq;
|
||||
using AsmdefHelper.DependencyGraph.Editor.DependencyNode.Sort;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.TestTools;
|
||||
|
||||
namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests {
|
||||
public class LinerSortTest {
|
||||
const float d = 10.0F;
|
||||
const float w = 10.0F;
|
||||
const float h = 10.0F;
|
||||
const float e = 0.0001F;
|
||||
ISortStrategy sortStrategy;
|
||||
|
||||
[SetUp]
|
||||
public void SetUpBeforeEveryTest() {
|
||||
Nodes.Init();
|
||||
sortStrategy = new LinerSortStrategy(Vector2.zero, d, w, h);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void TestLinerNodeDependency() {
|
||||
var nodes = new[] { Nodes._0, Nodes._1 };
|
||||
// [0]--->[1]
|
||||
Nodes._0.SetRequireNodes(new[] { Profiles._1});
|
||||
NodeProcessor.SetBeRequiredNodes(nodes);
|
||||
|
||||
var result = sortStrategy.Sort(nodes).ToArray();
|
||||
var node0 = result.FirstOrDefault(x => x.Profile == Profiles._0);
|
||||
var node1 = result.FirstOrDefault(x => x.Profile == Profiles._1);
|
||||
|
||||
Assert.That(node0, Is.Not.Null);
|
||||
Assert.That(node0.Position.x, Is.Zero);
|
||||
Assert.That(node0.Position.y, Is.Zero);
|
||||
Assert.That(node1, Is.Not.Null);
|
||||
Assert.That(node1.Position.x, Is.EqualTo(node0.Position.x + d + (w / 2.0F)).Within(e));
|
||||
Assert.That(node1.Position.y, Is.EqualTo(node0.Position.y).Within(e));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ecac0d687a574143a409b043040ce933
|
||||
timeCreated: 1605460235
|
@ -34,30 +34,9 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests {
|
||||
Assert.That(Nodes._1.Sources.Any(x => x.Equals(Profiles._0)));
|
||||
}
|
||||
|
||||
|
||||
static void SetSomeNodeDependency() {
|
||||
/*
|
||||
* ┌->[1]-┐
|
||||
* [0]-┴->[2]-┴->[4]--->[5]--->[6]
|
||||
* │ │
|
||||
* V │
|
||||
* [3]<-----------┘
|
||||
*
|
||||
* [7]--->[8] [9]
|
||||
*
|
||||
*
|
||||
*/
|
||||
Nodes._0.SetRequireNodes(new[] { Profiles._1, Profiles._2 });
|
||||
Nodes._1.SetRequireNodes(new[] { Profiles._4 });
|
||||
Nodes._2.SetRequireNodes(new[] { Profiles._3, Profiles._4 });
|
||||
Nodes._4.SetRequireNodes(new[] { Profiles._5 });
|
||||
Nodes._5.SetRequireNodes(new[] { Profiles._3, Profiles._6 });
|
||||
Nodes._7.SetRequireNodes(new[] { Profiles._8 });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestSomeNodeDependency() {
|
||||
SetSomeNodeDependency();
|
||||
Nodes.SetSomeNodeDependency();
|
||||
NodeProcessor.SetBeRequiredNodes(Nodes.All);
|
||||
// 0
|
||||
Assert.That(Nodes._0.Sources, Is.Empty);
|
||||
|
@ -48,5 +48,24 @@ namespace AsmdefHelper.DependencyGraph.Editor.DependencyNode.Tests {
|
||||
n.Destinations.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public static void SetSomeNodeDependency() {
|
||||
/*
|
||||
* ┌->[1]-┐
|
||||
* [0]-┴->[2]-┴->[4]--->[5]--->[6]
|
||||
* │ │
|
||||
* V │
|
||||
* [3]<-----------┘
|
||||
*
|
||||
* [7]--->[8] [9]
|
||||
*
|
||||
*/
|
||||
Nodes._0.SetRequireNodes(new[] { Profiles._1, Profiles._2 });
|
||||
Nodes._1.SetRequireNodes(new[] { Profiles._4 });
|
||||
Nodes._2.SetRequireNodes(new[] { Profiles._3, Profiles._4 });
|
||||
Nodes._4.SetRequireNodes(new[] { Profiles._5 });
|
||||
Nodes._5.SetRequireNodes(new[] { Profiles._3, Profiles._6 });
|
||||
Nodes._7.SetRequireNodes(new[] { Profiles._8 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user