         }
     }
 
+
     // Scenario 1:
+    // ===========
+    //
+    //  Line 1:       [Text]            1 [Text]
+    //  Line 2:       [Text]              [Text]
+    //  Line 3:       [Text]    > > >     [Text]
+    //  Line 4:       [Text]              [Text]
+    //  Line 5:       [Text]              [Text]
+    //
+    // Toggling "Ordered List" on Line 1 should switch its style, and maintain lines 2-5 unaffected.
+    //
+    func testApplyingOrderedListOnFirstParagraphAppliesOrderedList() {
+        let string = NSMutableAttributedString(string: plainText)
+
+        let formatter = TextListFormatter()
+        formatter.toggleList(ofStyle: .Ordered, inString: string, atRange: NSRange(location: 0, length: 1))
+
+        let ranges = paragraphRanges(inString: string)
+        let lists = textListAttributes(inString: string, atRanges: ranges)
+        let items = textListItemAttributes(inString: string, atRanges: ranges)
+
+        XCTAssert(lists.count == 1)
+        XCTAssert(items.count == 1)
+
+        XCTAssert(lists[0].style == .Ordered)
+        XCTAssert(items[0].number == 1)
+    }
+
+
+    // Scenario 2: (Mark I)
+    // ===========
+    //
+    //  Line 1:     1 [Text]              [Text]
+    //  Line 2:       [Text]              [Text]
+    //  Line 3:       [Text]    > > >     [Text]
+    //  Line 4:       [Text]              [Text]
+    //  Line 5:       [Text]              [Text]
+    //
+    // Toggling "Ordered List" on Line 1 should nuke it's list, and keep lines 2-5 unaffected.
+    //
+    func testRemovingOrderedListOnFirstParagraphEffectivelyNukesAnyLists() {
+        let string = NSMutableAttributedString(string: plainText)
+
+        let formatter = TextListFormatter()
+
+        // Toggle the 1st line as an Ordered List
+        formatter.toggleList(ofStyle: .Ordered, inString: string, atRange: NSRange(location: 0, length: 1))
+
+        // And... undo?
+        formatter.toggleList(ofStyle: .Ordered, inString: string, atRange: NSRange(location: 0, length: 1))
+
+        let ranges = paragraphRanges(inString: string)
+        let lists = textListAttributes(inString: string, atRanges: ranges)
+        let items = textListItemAttributes(inString: string, atRanges: ranges)
+
+        XCTAssert(lists.count == 0)
+        XCTAssert(items.count == 0)
+    }
+
+
+    // Scenario 2: (Mark II)
+    // ===========
+    //
+    //  Line 1:     1 [Text]              [Text]
+    //  Line 2:     2 [Text]            1 [Text]
+    //  Line 3:     3 [Text]    > > >   2 [Text]
+    //  Line 4:     4 [Text]            3 [Text]
+    //  Line 5:     5 [Text]            4 [Text]
+    //
+    // Toggling "Ordered List" on Line 1 should update Line 2-5.
+    //
+    func testToggleOrderedListOnFirstOrderedListItemUpdatesTheRemainingItemNumbers() {
+        let list = listWithOrderedStyle
+        let ranges = paragraphRanges(inString: list)
+
+        let formatter = TextListFormatter()
+        formatter.toggleList(ofStyle: .Ordered, inString: list, atRange: ranges[0])
+
+        let lists = textListAttributes(inString: list, atRanges: ranges)
+        let items = textListItemAttributes(inString: list, atRanges: ranges)
+
+        XCTAssert(lists.count == 4)
+        XCTAssert(items.count == 4)
+
+        for list in lists {
+            XCTAssert(list.style == .Ordered)
+        }
+
+        for (index, item) in items.enumerate() {
+            XCTAssert(item.number == index + 1)
+        }
+    }
+
+
+    // Scenario 2: (Mark III)
+    // ===========
+    //
+    //  Line 1:     - [Text]            - [Text]
+    //  Line 2:     1 [Text]            1 [Text]
+    //  Line 3:     - [Text]    > > >     [Text]
+    //  Line 4:     1 [Text]            1 [Text]
+    //  Line 5:     - [Text]            - [Text]
+    //
+    // Toggling "Unordered List" on Line 3 should nuke it's list, and keep lines 2-5 unaffected.
+    //
+    func testToggleListUpdatesStyleWhenThereWasAnExistingListWithDifferentStyles() {
+        let list = listWithAlternatedStyle
+        let ranges = paragraphRanges(inString: list)
+
+        // Toggle Ordered List on the first line
+        let formatter = TextListFormatter()
+        formatter.toggleList(ofStyle: .Unordered, inString: list, atRange: ranges[2])
+
+        //
+        let lists = textListAttributes(inString: list, atRanges: ranges)
+        let listItems = textListItemAttributes(inString: list, atRanges: ranges)
+
+        XCTAssert(lists.count == 4)
+        XCTAssert(listItems.count == 4)
+
+        XCTAssert(lists[0].style == .Unordered)
+        XCTAssert(lists[1].style == .Ordered)
+        XCTAssert(lists[2].style == .Ordered)
+        XCTAssert(lists[3].style == .Unordered)
+
+        XCTAssert(listItems[1].number == 1)
+        XCTAssert(listItems[2].number == 1)
+    }
+
+
+    // Scenario 3: (Mark I)
+    // ===========
+    //
+    //  Line 1:     1 [Text]            - [Text]
+    //  Line 2:     2 [Text]            - [Text]
+    //  Line 3:     3 [Text]    > > >   - [Text]
+    //  Line 4:     4 [Text]            - [Text]
+    //  Line 5:     5 [Text]            - [Text]
+    //
+    // Toggling "Unordered List" on Line 1 should switch everything to an Unordered List
+    //
+    func testToggleUnorderedListOnFirstOrderedListItemUpdatesTheRemainingItemNumbers() {
+        let list = listWithOrderedStyle
+        let ranges = paragraphRanges(inString: list)
+
+        let formatter = TextListFormatter()
+        formatter.toggleList(ofStyle: .Unordered, inString: list, atRange: ranges[0])
+
+        let lists = textListAttributes(inString: list, atRanges: ranges)
+        let items = textListItemAttributes(inString: list, atRanges: ranges)
+
+        XCTAssert(lists.count == 5)
+        XCTAssert(items.count == 5)
+
+        XCTAssert(lists[0].style == .Unordered)
+        XCTAssert(lists[1].style == .Unordered)
+        XCTAssert(lists[2].style == .Unordered)
+        XCTAssert(lists[3].style == .Unordered)
+        XCTAssert(lists[4].style == .Unordered)
+    }
+
+
+    // Scenario 3: (Mark II)
     // ===========
     //
     //  Line 1:     - [Text]            1 [Text]

            XCTAssert(item?.number == index + 1)
        }
    }
}



        XCTAssert(items[3].number == 1)
    }


    // Scenario 4:
    // ===========
    //
    //  Line 1:       [Text]            1 [Text]
