diff --git a/test/traverseGenerator-ordered.spec.tsx b/test/traverseGenerator-ordered.spec.tsx
new file mode 100644
index 0000000..cee8ce4
--- /dev/null
+++ b/test/traverseGenerator-ordered.spec.tsx
@@ -0,0 +1,312 @@
+import * as React from "react";
+
+// Import stuff from src
+// import {
+// FiberNodeForComponentClass,
+// FiberNodeForInstrinsicElement,
+// FiberNodeForFunctionComponent
+// } from "../src/mocked-types";
+import { traverseGenerator } from "../src";
+
+// Import test helpers and sample components
+import { mountAndGetRootNode } from "./utils/mount-in-enzyme";
+// import getWrappedComponent from './utils/getWrappedComponent';
+import CDepth1 from "./sample-components/depth-1-simple";
+import { FiberNodeForFunctionComponent } from "../src/mocked-types";
+// import CDepth2 from "./sample-components/depth-2-simple";
+// import CDepth5 from "./sample-components/depth-5-simple";
+// import FnDepth1 from './sample-components/depth-1-fn-simple';
+
+describe("traverseGenerator", () => {
+ let container: HTMLDivElement;
+
+ beforeEach(() => {
+ container = document.body.appendChild(document.createElement("div"));
+ });
+
+ afterEach(() => {
+ document.body.removeChild(container);
+ });
+
+ describe("basic", () => {
+ it("order doesn't matter for 1 node if self is present - case 1", () => {
+ const rootNode = mountAndGetRootNode(CDepth1, container);
+
+ const nodeIterator = traverseGenerator(rootNode, {
+ order: ["child", "sibling", "self"]
+ });
+ const nodes = [...nodeIterator];
+
+ // Can't be zero, in any case
+ expect(nodes.length).not.toBe(0);
+ // Check that only one node is yielded
+ expect(nodes.length).toBe(1);
+ });
+
+ it("order doesn't matter for 1 node if self is present - case 2", () => {
+ const rootNode = mountAndGetRootNode(CDepth1, container);
+
+ const nodeIterator = traverseGenerator(rootNode, {
+ order: ["child", "self", "sibling"]
+ });
+ const nodes = [...nodeIterator];
+
+ // Can't be zero, in any case
+ expect(nodes.length).not.toBe(0);
+ // Check that only one node is yielded
+ expect(nodes.length).toBe(1);
+ });
+
+ it("order doesn't matter for 1 node if self is present - case 3", () => {
+ const rootNode = mountAndGetRootNode(CDepth1, container);
+
+ const nodeIterator = traverseGenerator(rootNode, {
+ order: ["child", "self"]
+ });
+ const nodes = [...nodeIterator];
+
+ // Can't be zero, in any case
+ expect(nodes.length).not.toBe(0);
+ // Check that only one node is yielded
+ expect(nodes.length).toBe(1);
+ });
+
+ it("order doesn't matter for 1 node if self is present - case 4", () => {
+ const rootNode = mountAndGetRootNode(CDepth1, container);
+
+ const nodeIterator = traverseGenerator(rootNode, {
+ order: ["self"]
+ });
+ const nodes = [...nodeIterator];
+
+ // Can't be zero, in any case
+ expect(nodes.length).not.toBe(0);
+ // Check that only one node is yielded
+ expect(nodes.length).toBe(1);
+ });
+
+ it("order doesn't matter for 1 node if self is present - case 6", () => {
+ const rootNode = mountAndGetRootNode(CDepth1, container);
+
+ const nodeIterator = traverseGenerator(rootNode, {
+ order: ["sibling", "self"]
+ });
+ const nodes = [...nodeIterator];
+
+ // Can't be zero, in any case
+ expect(nodes.length).not.toBe(0);
+ // Check that only one node is yielded
+ expect(nodes.length).toBe(1);
+ });
+
+ it("order matters for 1 node if self is absent - case 1", () => {
+ const rootNode = mountAndGetRootNode(CDepth1, container);
+
+ const nodeIterator = traverseGenerator(rootNode, {
+ order: ["child", "sibling"]
+ });
+ const nodes = [...nodeIterator];
+
+ // Will be zero
+ expect(nodes.length).toBe(0);
+ // Check that no node is yielded
+ expect(nodes.length).not.toBe(1);
+ });
+
+ it("order matters for 1 node if self is absent - case 2", () => {
+ const rootNode = mountAndGetRootNode(CDepth1, container);
+
+ const nodeIterator = traverseGenerator(rootNode, {
+ order: ["sibling", "child"]
+ });
+ const nodes = [...nodeIterator];
+
+ // Will be zero
+ expect(nodes.length).toBe(0);
+ // Check that no node is yielded
+ expect(nodes.length).not.toBe(1);
+ });
+
+ it("order matters for 1 node if self is absent - case 3", () => {
+ const rootNode = mountAndGetRootNode(CDepth1, container);
+
+ const nodeIterator = traverseGenerator(rootNode, {
+ order: ["sibling"]
+ });
+ const nodes = [...nodeIterator];
+
+ // Will be zero
+ expect(nodes.length).toBe(0);
+ // Check that no node is yielded
+ expect(nodes.length).not.toBe(1);
+ });
+
+ it("order matters for 1 node if self is absent - case 4", () => {
+ const rootNode = mountAndGetRootNode(CDepth1, container);
+
+ const nodeIterator = traverseGenerator(rootNode, {
+ order: ["child"]
+ });
+ const nodes = [...nodeIterator];
+
+ // Will be zero
+ expect(nodes.length).toBe(0);
+ // Check that no node is yielded
+ expect(nodes.length).not.toBe(1);
+ });
+
+ it("should work for depth=3 depth-first", () => {
+ class C1 extends React.Component {
+ render() {
+ return (
+