From 3bba8083a800e0eca77fd24516134d21de91e9b6 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 5 Nov 2025 17:14:10 +0000
Subject: [PATCH 1/5] Initial plan
From 4003581b13ddae1884c3dbc8a92ebfb7b1a327cd Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 5 Nov 2025 17:17:21 +0000
Subject: [PATCH 2/5] Initial plan for preventing self-reference in Node
hierarchy
Co-authored-by: EbiseLutica <7106976+EbiseLutica@users.noreply.github.com>
---
"Promete.Docs/obj\\Debug/\\package.g.props" | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 "Promete.Docs/obj\\Debug/\\package.g.props"
diff --git "a/Promete.Docs/obj\\Debug/\\package.g.props" "b/Promete.Docs/obj\\Debug/\\package.g.props"
new file mode 100644
index 0000000..45637c6
--- /dev/null
+++ "b/Promete.Docs/obj\\Debug/\\package.g.props"
@@ -0,0 +1,21 @@
+
+
+
+ promete-docs
+ 1.0.0
+
+ astro dev
+ astro dev
+ astro build
+ astro preview
+ []
+
+ MIT
+ pnpm@8.15.1
+ ^0.29.2
+ ^4.16.14
+ ^1.49.0
+ ^2.1.0
+ ^1.81.0
+
+
\ No newline at end of file
From 9252ddc749f4f228264b33995e89ce57e414f47a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 5 Nov 2025 17:19:50 +0000
Subject: [PATCH 3/5] Add self-reference check to prevent
StackOverflowException
Co-authored-by: EbiseLutica <7106976+EbiseLutica@users.noreply.github.com>
---
Promete.Test/NodeTests.cs | 61 ++++++++++++++++++++++++++++++++
Promete/Nodes/ContainableNode.cs | 10 ++++++
2 files changed, 71 insertions(+)
create mode 100644 Promete.Test/NodeTests.cs
diff --git a/Promete.Test/NodeTests.cs b/Promete.Test/NodeTests.cs
new file mode 100644
index 0000000..fe6dd86
--- /dev/null
+++ b/Promete.Test/NodeTests.cs
@@ -0,0 +1,61 @@
+using FluentAssertions;
+using Promete.Nodes;
+
+namespace Promete.Test;
+
+public class NodeTests
+{
+ [Fact]
+ public void AddSelfAsChild_ShouldThrowArgumentException()
+ {
+ // Arrange
+ var container = new Container();
+
+ // Act & Assert
+ var act = () => container.Add(container);
+ act.Should().Throw()
+ .WithMessage("*自分自身*");
+ }
+
+ [Fact]
+ public void InsertSelfAsChild_ShouldThrowArgumentException()
+ {
+ // Arrange
+ var container = new Container();
+
+ // Act & Assert
+ var act = () => container.Insert(0, container);
+ act.Should().Throw()
+ .WithMessage("*自分自身*");
+ }
+
+ [Fact]
+ public void AddDifferentNode_ShouldSucceed()
+ {
+ // Arrange
+ var container = new Container();
+ var child = new Container();
+
+ // Act
+ container.Add(child);
+
+ // Assert
+ container.Count.Should().Be(1);
+ child.Parent.Should().Be(container);
+ }
+
+ [Fact]
+ public void InsertDifferentNode_ShouldSucceed()
+ {
+ // Arrange
+ var container = new Container();
+ var child = new Container();
+
+ // Act
+ container.Insert(0, child);
+
+ // Assert
+ container.Count.Should().Be(1);
+ child.Parent.Should().Be(container);
+ }
+}
diff --git a/Promete/Nodes/ContainableNode.cs b/Promete/Nodes/ContainableNode.cs
index bd97d1d..1ebe1b7 100644
--- a/Promete/Nodes/ContainableNode.cs
+++ b/Promete/Nodes/ContainableNode.cs
@@ -70,6 +70,11 @@ protected void SortChildrenIfNeeded()
protected void Add(Node node)
{
+ if (node == this)
+ {
+ throw new ArgumentException("ノードの子要素に自分自身を追加することはできません。", nameof(node));
+ }
+
node.Parent?.Remove(node);
node.Parent = this;
@@ -92,6 +97,11 @@ protected void Clear()
protected void Insert(int index, Node node)
{
+ if (node == this)
+ {
+ throw new ArgumentException("ノードの子要素に自分自身を追加することはできません。", nameof(node));
+ }
+
node.Parent?.Remove(this);
children.Insert(index, node);
From de46ddf79eb6241aea135d8fc2ffa4fa2e06a251 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 5 Nov 2025 17:21:56 +0000
Subject: [PATCH 4/5] Fix Insert method bug and add comprehensive tests
Co-authored-by: EbiseLutica <7106976+EbiseLutica@users.noreply.github.com>
---
Promete.Test/NodeTests.cs | 19 +++++++++++++++++++
Promete/Nodes/ContainableNode.cs | 2 +-
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/Promete.Test/NodeTests.cs b/Promete.Test/NodeTests.cs
index fe6dd86..b0bee79 100644
--- a/Promete.Test/NodeTests.cs
+++ b/Promete.Test/NodeTests.cs
@@ -58,4 +58,23 @@ public void InsertDifferentNode_ShouldSucceed()
container.Count.Should().Be(1);
child.Parent.Should().Be(container);
}
+
+ [Fact]
+ public void InsertNodeWithExistingParent_ShouldMoveNode()
+ {
+ // Arrange
+ var oldParent = new Container();
+ var newParent = new Container();
+ var child = new Container();
+
+ oldParent.Add(child);
+
+ // Act
+ newParent.Insert(0, child);
+
+ // Assert
+ oldParent.Count.Should().Be(0);
+ newParent.Count.Should().Be(1);
+ child.Parent.Should().Be(newParent);
+ }
}
diff --git a/Promete/Nodes/ContainableNode.cs b/Promete/Nodes/ContainableNode.cs
index 1ebe1b7..77caa5d 100644
--- a/Promete/Nodes/ContainableNode.cs
+++ b/Promete/Nodes/ContainableNode.cs
@@ -102,7 +102,7 @@ protected void Insert(int index, Node node)
throw new ArgumentException("ノードの子要素に自分自身を追加することはできません。", nameof(node));
}
- node.Parent?.Remove(this);
+ node.Parent?.Remove(node);
children.Insert(index, node);
node.Parent = this;
From 9de6d53d7caef3ac42fe023d0d65810254efbbba Mon Sep 17 00:00:00 2001
From: Ebise Lutica <7106976+EbiseLutica@users.noreply.github.com>
Date: Thu, 6 Nov 2025 02:58:55 +0900
Subject: [PATCH 5/5] Delete Promete.Docs/obj\Debug/\package.g.props
---
"Promete.Docs/obj\\Debug/\\package.g.props" | 21 ---------------------
1 file changed, 21 deletions(-)
delete mode 100644 "Promete.Docs/obj\\Debug/\\package.g.props"
diff --git "a/Promete.Docs/obj\\Debug/\\package.g.props" "b/Promete.Docs/obj\\Debug/\\package.g.props"
deleted file mode 100644
index 45637c6..0000000
--- "a/Promete.Docs/obj\\Debug/\\package.g.props"
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- promete-docs
- 1.0.0
-
- astro dev
- astro dev
- astro build
- astro preview
- []
-
- MIT
- pnpm@8.15.1
- ^0.29.2
- ^4.16.14
- ^1.49.0
- ^2.1.0
- ^1.81.0
-
-
\ No newline at end of file