From 3e0cfa56840b02a93fc8fa537cc1d393528783e1 Mon Sep 17 00:00:00 2001 From: Mitchell Irvin Date: Sat, 4 Aug 2018 21:59:53 -0400 Subject: [PATCH] #778 Implemented BSTIterator. Included comprehensive unit and integration tests. Refactored file structure to be friendly to future contributors with iterators of more data structures. Added JUnitPlatform to enable running test suite across all iterator implementations. Added README to /binarysearchtree to document what it does and how it works. --- iterator/etc/bst.png | Bin 0 -> 101622 bytes iterator/etc/iterator.ucls | 10 +- iterator/pom.xml | 6 ++ .../binarysearchtree/BstIterator.java | 78 ++++++++++++++ .../iterator/binarysearchtree/README.md | 86 +++++++++++++++ .../iterator/binarysearchtree/TreeNode.java | 66 ++++++++++++ .../iterator/interfaces/Iterator.java | 30 ++++++ .../com/iluwatar/iterator/{ => list}/App.java | 5 +- .../iluwatar/iterator/{ => list}/Item.java | 2 +- .../iterator/{ => list}/ItemIterator.java | 2 +- .../iterator/{ => list}/ItemType.java | 2 +- .../iterator/{ => list}/TreasureChest.java | 2 +- .../{ => list}/TreasureChestItemIterator.java | 2 +- .../java/com/iluwatar/iterator/AppTest.java | 48 ++++----- .../binarysearchtree/BstIteratorTest.java | 98 ++++++++++++++++++ .../binarysearchtree/TreeNodeTest.java | 55 ++++++++++ .../{ => list}/TreasureChestTest.java | 6 +- 17 files changed, 458 insertions(+), 40 deletions(-) create mode 100644 iterator/etc/bst.png create mode 100644 iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/BstIterator.java create mode 100644 iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/README.md create mode 100644 iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/TreeNode.java create mode 100644 iterator/src/main/java/com/iluwatar/iterator/interfaces/Iterator.java rename iterator/src/main/java/com/iluwatar/iterator/{ => list}/App.java (93%) rename iterator/src/main/java/com/iluwatar/iterator/{ => list}/Item.java (97%) rename iterator/src/main/java/com/iluwatar/iterator/{ => list}/ItemIterator.java (97%) rename iterator/src/main/java/com/iluwatar/iterator/{ => list}/ItemType.java (97%) rename iterator/src/main/java/com/iluwatar/iterator/{ => list}/TreasureChest.java (98%) rename iterator/src/main/java/com/iluwatar/iterator/{ => list}/TreasureChestItemIterator.java (98%) create mode 100644 iterator/src/test/java/com/iluwatar/iterator/binarysearchtree/BstIteratorTest.java create mode 100644 iterator/src/test/java/com/iluwatar/iterator/binarysearchtree/TreeNodeTest.java rename iterator/src/test/java/com/iluwatar/iterator/{ => list}/TreasureChestTest.java (95%) diff --git a/iterator/etc/bst.png b/iterator/etc/bst.png new file mode 100644 index 0000000000000000000000000000000000000000..52ce7013e14f5d3f1fc81404e1dbdd7ef0f4a7a3 GIT binary patch literal 101622 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 literal 0 HcmV?d00001 diff --git a/iterator/etc/iterator.ucls b/iterator/etc/iterator.ucls index 440f9a28b..d36dad95d 100644 --- a/iterator/etc/iterator.ucls +++ b/iterator/etc/iterator.ucls @@ -1,7 +1,7 @@ - - - - - diff --git a/iterator/pom.xml b/iterator/pom.xml index 6581b8224..81a785dd1 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -48,5 +48,11 @@ junit-jupiter-params test + + org.junit.platform + junit-platform-runner + 1.2.0 + test + diff --git a/iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/BstIterator.java b/iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/BstIterator.java new file mode 100644 index 000000000..b61482389 --- /dev/null +++ b/iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/BstIterator.java @@ -0,0 +1,78 @@ +/** + * The MIT License + * Copyright (c) 2014-2016 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.iterator.binarysearchtree; + +import com.iluwatar.iterator.interfaces.Iterator; +import java.util.ArrayDeque; + +/** + * This BstIterator iterates IN order. For example, given a BST with Integer values, + * expect to retrieve TreeNodes according to the Integer's natural ordering (1, 2, 3...) + * @param This Iterator has been implemented with generic typing to allow traversal of TreeNodes of various types + */ +public class BstIterator implements Iterator { + + private ArrayDeque> pathStack; + + public BstIterator(TreeNode root) { + pathStack = new ArrayDeque<>(); + pushPathToNextSmallest(root); + } + + /** + * This BstIterator manages to use O(h) extra space, where h is the height of the tree + * It achieves this by maintaining a stack of the nodes to handle (pushing all left nodes first), + * before handling self or right node + * @param node TreeNode that acts as root of the subtree we're interested in. + */ + private void pushPathToNextSmallest(TreeNode node) { + while (node != null) { + pathStack.push(node); + node = node.getLeft(); + } + } + + /** + * @return true if this iterator has a "next" element + */ + @Override + public boolean hasNext() { + return !pathStack.isEmpty(); + } + + /** + * + * @return TreeNode next. The next element according to our in-order traversal of the given BST + * @throws IllegalStateException if this iterator does not have a next element + */ + @Override + public TreeNode next() throws IllegalStateException { + if (pathStack.isEmpty()) { + throw new IllegalStateException(); + } + TreeNode next = pathStack.pop(); + pushPathToNextSmallest(next.getRight()); + return next; + } + +} diff --git a/iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/README.md b/iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/README.md new file mode 100644 index 000000000..766c4e1c5 --- /dev/null +++ b/iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/README.md @@ -0,0 +1,86 @@ +# BSTIterator +An implementation of the Iterator design pattern, for the Binary Search Tree +data structure. A great explanation of BSTs can be found in this [video tutorial](https://www.youtube.com/watch?v=i_Q0v_Ct5lY). + +### What it Does +This iterator assumes that the given binary search tree inserts nodes of smaller +value to the left, and nodes of larger value to the right of current node. Accordingly, +this iterator will return nodes according to "In Order" binary tree traversal. +This means that given a binary search tree like the following, the iterator would +return values in order: 1, 3, 4, 6, 7, 8, 10, 13, 14. + +![BST](../../../../../../../etc/bst.png "Binary Search Tree") + +### How It's Done +**The trivial solution** to a binary search tree iterator would be to construct a List (or similar +linear data structure) when you construct the BSTIterator. This would require traversing the entire +BST, adding each node value to your list as you go. The downside to the trivial solution is twofold. +You're front loading the work by requiring the BSTIterator's constructor to traverse the entire tree, +and you're taking up more memory by maintaining (worst case) every node in the tree in a separate +data structure. In Big O terms, here are the costs, where n is the number of nodes in the tree: +* Constructor Run Time: O(n) +* `next()` Run Time: O(1) +* `hasNext()` Run Time: O(1) +* Extra Space: O(n) + +**A better solution** is to maintain _only_ the path to the next smallest node. For instance, given +the BST above, when you first create your BSTIterator, instead of traversing the entire tree, you +would navigate to the next smallest node (in this case, 1), pushing nodes onto a stack along the way. +Your BSTIterator Constructor would look like: +``` +private ArrayDeque pathStack; + +public BSTIterator(TreeNode root) { + pathStack = new ArrayDeque<>(); + pushPathToNextSmallest(root); +} + +private void pushPathToNextSmallest(TreeNode node) { + while (node != null) { + pathStack.push(node); + node = node.getLeft(); + } +} +``` + +After the constructor is called our BST, your `pathStack` would look like this: + +1\ +3\ +8 + +This way, you're certain of what the next smallest node is because it lives on top of your path +stack. In order to maintain the integrity of this path stack, when you call `next()` and pop a +node off the stack, you must check to see if it has a right child. If it does, then you must follow the right +child's path to the next smallest node (pushing onto your path stack as you go). Given our above example, +calling `next()` on our BSTIterator twice would return node "3". Node "3" has a right child, indicating +a path to a node smaller than 3's parent. In this case, you would push node "6" onto the stack, +and node "4" onto the stack. `next()` would look like this: + +``` +public TreeNode next() throws IllegalStateException { + // If the user calls next() and hasNext() is false + if (pathStack.isEmpty()) { + throw new IllegalStateException(); + } + TreeNode next = pathStack.pop(); + // follow right child to next smallest node + pushPathToNextSmallest(next.getRight()); + return next; +} +``` + +**Key Concept:** The path to the smallest node of a given subtree is navigating straight to the +leftmost node of that subtree. + +In Big O terms, here are the costs for our improved solution, where h is the height of the tree: +* Constructor Run Time: O(h) +* `next()` Amortized Run Time: O(1) +* `hasNext()` Run Time: O(1) +* Extra Space: O(h) + +As you can see, this solution more evenly distributes the work. It yields the same amortized +runtime for `next()`, reduces the run time of the constructor, and uses less extra space. + + + \ No newline at end of file diff --git a/iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/TreeNode.java b/iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/TreeNode.java new file mode 100644 index 000000000..ceffa6cf5 --- /dev/null +++ b/iterator/src/main/java/com/iluwatar/iterator/binarysearchtree/TreeNode.java @@ -0,0 +1,66 @@ +/** + * The MIT License Copyright (c) 2014-2016 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.iluwatar.iterator.binarysearchtree; + +/** + * This TreeNode class allows for a generically typed value. + * @param generically typed to accept various data types for the val property + */ +public class TreeNode { + + private T val; + private TreeNode left; + private TreeNode right; + + /** + * Creates a TreeNode with a given value, and null children + * @param val The value of the given node + */ + public TreeNode(T val) { + this.val = val; + this.left = null; + this.right = null; + } + + T getVal() { + return val; + } + + TreeNode getLeft() { + return left; + } + + void setLeft(TreeNode left) { + this.left = left; + } + + TreeNode getRight() { + return right; + } + + void setRight(TreeNode right) { + this.right = right; + } + + @Override + public String toString() { + return val.toString(); + } + +} diff --git a/iterator/src/main/java/com/iluwatar/iterator/interfaces/Iterator.java b/iterator/src/main/java/com/iluwatar/iterator/interfaces/Iterator.java new file mode 100644 index 000000000..a71c2440e --- /dev/null +++ b/iterator/src/main/java/com/iluwatar/iterator/interfaces/Iterator.java @@ -0,0 +1,30 @@ +/** + * The MIT License Copyright (c) 2014-2016 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.iluwatar.iterator.interfaces; + +/** + * Iterator interface to be implemented by iterators over various data structures + * @param generically typed for various objects + */ +public interface Iterator { + + boolean hasNext(); + + T next(); +} diff --git a/iterator/src/main/java/com/iluwatar/iterator/App.java b/iterator/src/main/java/com/iluwatar/iterator/list/App.java similarity index 93% rename from iterator/src/main/java/com/iluwatar/iterator/App.java rename to iterator/src/main/java/com/iluwatar/iterator/list/App.java index d283347cb..9796b4f6d 100644 --- a/iterator/src/main/java/com/iluwatar/iterator/App.java +++ b/iterator/src/main/java/com/iluwatar/iterator/list/App.java @@ -20,8 +20,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.iterator; +package com.iluwatar.iterator.list; +import com.iluwatar.iterator.interfaces.Iterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,7 +31,7 @@ import org.slf4j.LoggerFactory; * The Iterator pattern is a design pattern in which an iterator is used to traverse a container and * access the container's elements. The Iterator pattern decouples algorithms from containers. *

- * In this example the Iterator ({@link ItemIterator}) adds abstraction layer on top of a collection + * In this example the Iterator ({@link Iterator}) adds abstraction layer on top of a collection * ({@link TreasureChest}). This way the collection can change its internal implementation without * affecting its clients. * diff --git a/iterator/src/main/java/com/iluwatar/iterator/Item.java b/iterator/src/main/java/com/iluwatar/iterator/list/Item.java similarity index 97% rename from iterator/src/main/java/com/iluwatar/iterator/Item.java rename to iterator/src/main/java/com/iluwatar/iterator/list/Item.java index 47bc11354..7f0f92d99 100644 --- a/iterator/src/main/java/com/iluwatar/iterator/Item.java +++ b/iterator/src/main/java/com/iluwatar/iterator/list/Item.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.iterator; +package com.iluwatar.iterator.list; /** * diff --git a/iterator/src/main/java/com/iluwatar/iterator/ItemIterator.java b/iterator/src/main/java/com/iluwatar/iterator/list/ItemIterator.java similarity index 97% rename from iterator/src/main/java/com/iluwatar/iterator/ItemIterator.java rename to iterator/src/main/java/com/iluwatar/iterator/list/ItemIterator.java index 0eab2f075..d5024daf5 100644 --- a/iterator/src/main/java/com/iluwatar/iterator/ItemIterator.java +++ b/iterator/src/main/java/com/iluwatar/iterator/list/ItemIterator.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.iterator; +package com.iluwatar.iterator.list; /** * diff --git a/iterator/src/main/java/com/iluwatar/iterator/ItemType.java b/iterator/src/main/java/com/iluwatar/iterator/list/ItemType.java similarity index 97% rename from iterator/src/main/java/com/iluwatar/iterator/ItemType.java rename to iterator/src/main/java/com/iluwatar/iterator/list/ItemType.java index 4cf36926e..e36062681 100644 --- a/iterator/src/main/java/com/iluwatar/iterator/ItemType.java +++ b/iterator/src/main/java/com/iluwatar/iterator/list/ItemType.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.iterator; +package com.iluwatar.iterator.list; /** * diff --git a/iterator/src/main/java/com/iluwatar/iterator/TreasureChest.java b/iterator/src/main/java/com/iluwatar/iterator/list/TreasureChest.java similarity index 98% rename from iterator/src/main/java/com/iluwatar/iterator/TreasureChest.java rename to iterator/src/main/java/com/iluwatar/iterator/list/TreasureChest.java index 4b9959269..8428b2308 100644 --- a/iterator/src/main/java/com/iluwatar/iterator/TreasureChest.java +++ b/iterator/src/main/java/com/iluwatar/iterator/list/TreasureChest.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.iterator; +package com.iluwatar.iterator.list; import java.util.ArrayList; import java.util.List; diff --git a/iterator/src/main/java/com/iluwatar/iterator/TreasureChestItemIterator.java b/iterator/src/main/java/com/iluwatar/iterator/list/TreasureChestItemIterator.java similarity index 98% rename from iterator/src/main/java/com/iluwatar/iterator/TreasureChestItemIterator.java rename to iterator/src/main/java/com/iluwatar/iterator/list/TreasureChestItemIterator.java index 9d841259f..80f019880 100644 --- a/iterator/src/main/java/com/iluwatar/iterator/TreasureChestItemIterator.java +++ b/iterator/src/main/java/com/iluwatar/iterator/list/TreasureChestItemIterator.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.iterator; +package com.iluwatar.iterator.list; import java.util.List; diff --git a/iterator/src/test/java/com/iluwatar/iterator/AppTest.java b/iterator/src/test/java/com/iluwatar/iterator/AppTest.java index f448a378e..a879df31e 100644 --- a/iterator/src/test/java/com/iluwatar/iterator/AppTest.java +++ b/iterator/src/test/java/com/iluwatar/iterator/AppTest.java @@ -1,39 +1,33 @@ /** - * The MIT License - * Copyright (c) 2014-2016 Ilkka Seppälä + * The MIT License Copyright (c) 2014-2016 Ilkka Seppälä * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.iluwatar.iterator; -import org.junit.jupiter.api.Test; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.SuiteDisplayName; +import org.junit.runner.RunWith; /** - * - * Application test - * + * Runs a test suite containing all tests within the com.iluwatar.iterator package */ +@RunWith(JUnitPlatform.class) +@SuiteDisplayName("Iterator Test Suite") +@SelectPackages("com.iluwatar.iterator") public class AppTest { - - @Test - public void test() { - String[] args = {}; - App.main(args); - } -} +} \ No newline at end of file diff --git a/iterator/src/test/java/com/iluwatar/iterator/binarysearchtree/BstIteratorTest.java b/iterator/src/test/java/com/iluwatar/iterator/binarysearchtree/BstIteratorTest.java new file mode 100644 index 000000000..09645edff --- /dev/null +++ b/iterator/src/test/java/com/iluwatar/iterator/binarysearchtree/BstIteratorTest.java @@ -0,0 +1,98 @@ +/** + * The MIT License Copyright (c) 2014-2016 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.iluwatar.iterator.binarysearchtree; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.iluwatar.iterator.AppTest; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; + +@TestInstance(Lifecycle.PER_CLASS) +class BstIteratorTest extends AppTest { + + private TreeNode nonEmptyRoot; + private TreeNode emptyRoot; + + @BeforeAll + void createTrees() { + nonEmptyRoot = new TreeNode(Integer.valueOf(5)); + nonEmptyRoot.setLeft(new TreeNode(3)); + nonEmptyRoot.setRight(new TreeNode(7)); + nonEmptyRoot.getLeft().setLeft(new TreeNode(1)); + nonEmptyRoot.getLeft().setRight(new TreeNode(4)); + nonEmptyRoot.getRight().setLeft(new TreeNode(6)); + + emptyRoot = null; + } + + @Test + void nextWithEmptyTree() { + BstIterator iter = new BstIterator(emptyRoot); + assertThrows(IllegalStateException.class, iter::next, + "next() should throw an IllegalStateException if hasNext() is false."); + } + + @Test + void nextWithPopulatedTree() { + BstIterator iter = new BstIterator(nonEmptyRoot); + assertEquals(iter.next().getVal(), 1, "First Node is 1."); + assertEquals(iter.next().getVal(), 3, "Second Node is 3."); + assertEquals(iter.next().getVal(), 4, "Third Node is 4."); + assertEquals(iter.next().getVal(), 5, "Fourth Node is 5."); + assertEquals(iter.next().getVal(), 6, "Fifth Node is 6."); + assertEquals(iter.next().getVal(), 7, "Sixth Node is 7."); + } + + @Test + void hasNextWithEmptyTree() { + BstIterator iter = new BstIterator(emptyRoot); + assertFalse(iter.hasNext(), "hasNext() should return false for empty tree."); + } + + @Test + void hasNextWithPopulatedTree() { + BstIterator iter = new BstIterator(nonEmptyRoot); + assertTrue(iter.hasNext(), "hasNext() should return true for populated tree."); + } + + @Test + void nextAndHasNextAcrossEntirePopulatedTree() { + BstIterator iter = new BstIterator(nonEmptyRoot); + assertTrue(iter.hasNext(), "Iterator hasNext() should be true."); + assertEquals(iter.next().getVal(), 1, "First Node is 1."); + assertTrue(iter.hasNext(), "Iterator hasNext() should be true."); + assertEquals(iter.next().getVal(), 3, "Second Node is 3."); + assertTrue(iter.hasNext(), "Iterator hasNext() should be true."); + assertEquals(iter.next().getVal(), 4, "Third Node is 4."); + assertTrue(iter.hasNext(), "Iterator hasNext() should be true."); + assertEquals(iter.next().getVal(), 5, "Fourth Node is 5."); + assertTrue(iter.hasNext(), "Iterator hasNext() should be true."); + assertEquals(iter.next().getVal(), 6, "Fifth Node is 6."); + assertTrue(iter.hasNext(), "Iterator hasNext() should be true."); + assertEquals(iter.next().getVal(), 7, "Sixth Node is 7."); + assertFalse(iter.hasNext(), "Iterator hasNext() should be false, end of tree."); + } + +} diff --git a/iterator/src/test/java/com/iluwatar/iterator/binarysearchtree/TreeNodeTest.java b/iterator/src/test/java/com/iluwatar/iterator/binarysearchtree/TreeNodeTest.java new file mode 100644 index 000000000..8dd2e694e --- /dev/null +++ b/iterator/src/test/java/com/iluwatar/iterator/binarysearchtree/TreeNodeTest.java @@ -0,0 +1,55 @@ +/** + * The MIT License Copyright (c) 2014-2016 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.iluwatar.iterator.binarysearchtree; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import org.junit.jupiter.api.Test; + +/** + * Comprehensive tests for TreeNode POJO + * @param generically typed for TreeNode + */ +public class TreeNodeTest { + + @Test + void treeNodeGetters() { + TreeNode node = new TreeNode(1); + assertEquals(node.getVal(), 1); + assertNull(node.getLeft(), "Left child should be initialized as null."); + assertNull(node.getRight(), "Right child should be initialized as null."); + } + + @Test + void treeNodeSetters() { + TreeNode node = new TreeNode(3); + node.setLeft(new TreeNode(1)); + assertEquals(node.getLeft().getVal(), 1, "Left node has a value of 1."); + node.setRight(new TreeNode(5)); + assertEquals(node.getRight().getVal(), 5, "Right node has a value of 5"); + } + + @Test + void treeNodeToString() { + TreeNode node = new TreeNode(3); + assertEquals(node.toString(), "3", "node.toString() should return string value."); + } + +} diff --git a/iterator/src/test/java/com/iluwatar/iterator/TreasureChestTest.java b/iterator/src/test/java/com/iluwatar/iterator/list/TreasureChestTest.java similarity index 95% rename from iterator/src/test/java/com/iluwatar/iterator/TreasureChestTest.java rename to iterator/src/test/java/com/iluwatar/iterator/list/TreasureChestTest.java index 665666aa7..ebfdbe9f1 100644 --- a/iterator/src/test/java/com/iluwatar/iterator/TreasureChestTest.java +++ b/iterator/src/test/java/com/iluwatar/iterator/list/TreasureChestTest.java @@ -20,8 +20,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.iterator; +package com.iluwatar.iterator.list; +import com.iluwatar.iterator.list.Item; +import com.iluwatar.iterator.list.ItemIterator; +import com.iluwatar.iterator.list.ItemType; +import com.iluwatar.iterator.list.TreasureChest; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource;