From f97b81ccb5212939789205cad26c4c6886aa4637 Mon Sep 17 00:00:00 2001 From: HossamSaberr Date: Sat, 28 Feb 2026 00:08:35 +0200 Subject: [PATCH 1/3] Fix: Prevent UI freeze --- .../CTAVLNilNode.extension.st | 6 ++++++ .../CTAVLNode.extension.st | 8 ++++++++ .../CTAVLTreeTest.class.st | 17 +++++++++++------ src/Containers-AVL-Tree/CTAVLTree.class.st | 14 +++----------- 4 files changed, 28 insertions(+), 17 deletions(-) create mode 100644 src/Containers-AVL-Tree-Inspector/CTAVLNilNode.extension.st create mode 100644 src/Containers-AVL-Tree-Inspector/CTAVLNode.extension.st diff --git a/src/Containers-AVL-Tree-Inspector/CTAVLNilNode.extension.st b/src/Containers-AVL-Tree-Inspector/CTAVLNilNode.extension.st new file mode 100644 index 0000000..83fb11a --- /dev/null +++ b/src/Containers-AVL-Tree-Inspector/CTAVLNilNode.extension.st @@ -0,0 +1,6 @@ +Extension { #name : 'CTAVLNilNode' } + +{ #category : '*Containers-AVL-Tree-Inspector' } +CTAVLNilNode >> allChildren [ + ^ #() +] diff --git a/src/Containers-AVL-Tree-Inspector/CTAVLNode.extension.st b/src/Containers-AVL-Tree-Inspector/CTAVLNode.extension.st new file mode 100644 index 0000000..4a86c84 --- /dev/null +++ b/src/Containers-AVL-Tree-Inspector/CTAVLNode.extension.st @@ -0,0 +1,8 @@ +Extension { #name : 'CTAVLNode' } + +{ #category : '*Containers-AVL-Tree-Inspector' } +CTAVLNode >> allChildren [ + ^ Array streamContents: [ :s | + left isNilNode ifFalse: [ s nextPut: left ]. + right isNilNode ifFalse: [ s nextPut: right ] ] +] diff --git a/src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st b/src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st index 5b11674..bb9ce26 100644 --- a/src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st +++ b/src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st @@ -40,12 +40,17 @@ CTAVLTreeTest >> testAddSingleElement [ { #category : 'tests' } CTAVLTreeTest >> testAllChildren [ - - | elements | - elements := (1 to: 10000) collect: [ :i | Random new nextIntegerBetween: 1 and: 100000000 ]. - tree addAll: elements. - - self assertCollection: (tree allChildren collect: #contents) hasSameElements: elements + + tree addAll: #(20 10 30). + + self assert: tree allChildren size equals: 1. + self assert: tree allChildren first contents equals: 20. + + self assert: tree root allChildren size equals: 2. + self assert: (tree root allChildren collect: #contents) asArray equals: #(10 30). + + self assert: tree root left allChildren isEmpty. + self assert: tree root right allChildren isEmpty. ] { #category : 'tests' } diff --git a/src/Containers-AVL-Tree/CTAVLTree.class.st b/src/Containers-AVL-Tree/CTAVLTree.class.st index 300c453..c4c6ff0 100644 --- a/src/Containers-AVL-Tree/CTAVLTree.class.st +++ b/src/Containers-AVL-Tree/CTAVLTree.class.st @@ -38,17 +38,9 @@ CTAVLTree >> addAll: aCollection [ { #category : 'accessing' } CTAVLTree >> allChildren [ - - | currentNode nodesToVisit children | - children := Set new. - nodesToVisit := LinkedList with: root. - - [ nodesToVisit isNotEmpty ] whileTrue: [ - currentNode := nodesToVisit removeFirst. - children add: currentNode. - nodesToVisit addAll: (currentNode children reject: #isNilNode) ]. - - ^ children + ^ root isNilNode + ifTrue: [ #() ] + ifFalse: [ { root } ] ] { #category : 'enumerating' } From 3b5f5f21b9aac8ee515f4db85a96db6fbb6bd79a Mon Sep 17 00:00:00 2001 From: HossamSaberr Date: Sun, 1 Mar 2026 14:19:43 +0200 Subject: [PATCH 2/3] fix: Revert allChildren semantics, add Spec2 Tree Inspector and canvas size limit --- .../CTAVLNilNode.extension.st | 6 --- .../CTAVLNode.extension.st | 8 ---- .../CTAVLTree.extension.st | 47 ++++++++++++++++--- .../CTAVLTreeTest.class.st | 15 ++---- src/Containers-AVL-Tree/CTAVLTree.class.st | 7 --- 5 files changed, 46 insertions(+), 37 deletions(-) delete mode 100644 src/Containers-AVL-Tree-Inspector/CTAVLNilNode.extension.st delete mode 100644 src/Containers-AVL-Tree-Inspector/CTAVLNode.extension.st diff --git a/src/Containers-AVL-Tree-Inspector/CTAVLNilNode.extension.st b/src/Containers-AVL-Tree-Inspector/CTAVLNilNode.extension.st deleted file mode 100644 index 83fb11a..0000000 --- a/src/Containers-AVL-Tree-Inspector/CTAVLNilNode.extension.st +++ /dev/null @@ -1,6 +0,0 @@ -Extension { #name : 'CTAVLNilNode' } - -{ #category : '*Containers-AVL-Tree-Inspector' } -CTAVLNilNode >> allChildren [ - ^ #() -] diff --git a/src/Containers-AVL-Tree-Inspector/CTAVLNode.extension.st b/src/Containers-AVL-Tree-Inspector/CTAVLNode.extension.st deleted file mode 100644 index 4a86c84..0000000 --- a/src/Containers-AVL-Tree-Inspector/CTAVLNode.extension.st +++ /dev/null @@ -1,8 +0,0 @@ -Extension { #name : 'CTAVLNode' } - -{ #category : '*Containers-AVL-Tree-Inspector' } -CTAVLNode >> allChildren [ - ^ Array streamContents: [ :s | - left isNilNode ifFalse: [ s nextPut: left ]. - right isNilNode ifFalse: [ s nextPut: right ] ] -] diff --git a/src/Containers-AVL-Tree-Inspector/CTAVLTree.extension.st b/src/Containers-AVL-Tree-Inspector/CTAVLTree.extension.st index b9635bd..a25c668 100644 --- a/src/Containers-AVL-Tree-Inspector/CTAVLTree.extension.st +++ b/src/Containers-AVL-Tree-Inspector/CTAVLTree.extension.st @@ -1,13 +1,48 @@ Extension { #name : 'CTAVLTree' } { #category : '*Containers-AVL-Tree-Inspector' } -CTAVLTree >> inspectorCanvas: aBuilder [ +CTAVLTree >> allChildren [ + | allNodes queue currentNode | + allNodes := OrderedCollection new. + self root isNilNode ifTrue: [ ^ allNodes ]. + + queue := OrderedCollection with: self root. + [ queue isNotEmpty ] whileTrue: [ + currentNode := queue removeFirst. + allNodes add: currentNode. + currentNode left isNilNode ifFalse: [ queue add: currentNode left ]. + currentNode right isNilNode ifFalse: [ queue add: currentNode right ] + ]. + + ^ allNodes +] +{ #category : '*Containers-AVL-Tree-Inspector' } +CTAVLTree >> inspectorCanvas: aBuilder [ + + self size > 10000 ifTrue: [ + ^ aBuilder newText + text: 'Tree is too large to render graphically (', self size asString, ' nodes). Please use the Tree tab.'; + yourself ]. + ^ (aBuilder instantiate: SpRoassalInspectorPresenter) - canvas: (CTAVLTreeVisualizer new - tree: self; - build; - canvas); - yourself + canvas: (CTAVLTreeVisualizer new + tree: self; + build; + canvas); + yourself +] + +{ #category : '*Containers-AVL-Tree-Inspector' } +CTAVLTree >> inspectorTree: aBuilder [ + + ^ aBuilder newTree + roots: { self root }; + children: [ :node | + Array streamContents: [ :s | + node left isNilNode ifFalse: [ s nextPut: node left ]. + node right isNilNode ifFalse: [ s nextPut: node right ] ] ]; + display: [ :node | node contents asString ]; + yourself ] diff --git a/src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st b/src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st index bb9ce26..7aad641 100644 --- a/src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st +++ b/src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st @@ -41,16 +41,11 @@ CTAVLTreeTest >> testAddSingleElement [ { #category : 'tests' } CTAVLTreeTest >> testAllChildren [ - tree addAll: #(20 10 30). - - self assert: tree allChildren size equals: 1. - self assert: tree allChildren first contents equals: 20. - - self assert: tree root allChildren size equals: 2. - self assert: (tree root allChildren collect: #contents) asArray equals: #(10 30). - - self assert: tree root left allChildren isEmpty. - self assert: tree root right allChildren isEmpty. + | elements | + elements := (1 to: 10000) collect: [ :i | Random new nextIntegerBetween: 1 and: 100000000 ]. + tree addAll: elements. + + self assertCollection: (tree allChildren collect: #contents) hasSameElements: elements ] { #category : 'tests' } diff --git a/src/Containers-AVL-Tree/CTAVLTree.class.st b/src/Containers-AVL-Tree/CTAVLTree.class.st index c4c6ff0..155a8a0 100644 --- a/src/Containers-AVL-Tree/CTAVLTree.class.st +++ b/src/Containers-AVL-Tree/CTAVLTree.class.st @@ -36,13 +36,6 @@ CTAVLTree >> addAll: aCollection [ ^ aCollection ] -{ #category : 'accessing' } -CTAVLTree >> allChildren [ - ^ root isNilNode - ifTrue: [ #() ] - ifFalse: [ { root } ] -] - { #category : 'enumerating' } CTAVLTree >> anySatisfy: aBlock [ From 836594449a8ad10ef0158ba13d8d5fee6185f175 Mon Sep 17 00:00:00 2001 From: HossamSaberr Date: Tue, 3 Mar 2026 19:12:27 +0200 Subject: [PATCH 3/3] Move allChildren method from inspector extension to core package --- .../CTAVLTree.extension.st | 17 ----------------- src/Containers-AVL-Tree/CTAVLTree.class.st | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Containers-AVL-Tree-Inspector/CTAVLTree.extension.st b/src/Containers-AVL-Tree-Inspector/CTAVLTree.extension.st index a25c668..df6a480 100644 --- a/src/Containers-AVL-Tree-Inspector/CTAVLTree.extension.st +++ b/src/Containers-AVL-Tree-Inspector/CTAVLTree.extension.st @@ -1,22 +1,5 @@ Extension { #name : 'CTAVLTree' } -{ #category : '*Containers-AVL-Tree-Inspector' } -CTAVLTree >> allChildren [ - | allNodes queue currentNode | - allNodes := OrderedCollection new. - self root isNilNode ifTrue: [ ^ allNodes ]. - - queue := OrderedCollection with: self root. - [ queue isNotEmpty ] whileTrue: [ - currentNode := queue removeFirst. - allNodes add: currentNode. - currentNode left isNilNode ifFalse: [ queue add: currentNode left ]. - currentNode right isNilNode ifFalse: [ queue add: currentNode right ] - ]. - - ^ allNodes -] - { #category : '*Containers-AVL-Tree-Inspector' } CTAVLTree >> inspectorCanvas: aBuilder [ diff --git a/src/Containers-AVL-Tree/CTAVLTree.class.st b/src/Containers-AVL-Tree/CTAVLTree.class.st index 155a8a0..8e0ff9d 100644 --- a/src/Containers-AVL-Tree/CTAVLTree.class.st +++ b/src/Containers-AVL-Tree/CTAVLTree.class.st @@ -36,6 +36,23 @@ CTAVLTree >> addAll: aCollection [ ^ aCollection ] +{ #category : 'accessing' } +CTAVLTree >> allChildren [ + | allNodes queue currentNode | + allNodes := OrderedCollection new. + self root isNilNode ifTrue: [ ^ allNodes ]. + + queue := OrderedCollection with: self root. + [ queue isNotEmpty ] whileTrue: [ + currentNode := queue removeFirst. + allNodes add: currentNode. + currentNode left isNilNode ifFalse: [ queue add: currentNode left ]. + currentNode right isNilNode ifFalse: [ queue add: currentNode right ] + ]. + + ^ allNodes +] + { #category : 'enumerating' } CTAVLTree >> anySatisfy: aBlock [