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