def test_copy(self):
        """ Test if returns a copy of it's contents """
        sl = SortedList()

        self.assertEqual(sl.copy(), [])

        sl.extend([10, 5, 20, 3])
        self.assertEqual(sl.copy(), [3, 5, 10, 20])
    def test_clear(self):
        """ Test if object clears it's contents """
        sl = SortedList()
        sl.extend([0, 10, 20, -5, -200])

        sl.clear()
        self.assertEqual(len(sl), 0)
        self.assertEqual(sl.sequence, [])
    def test_count(self):
        """ Test if returns correct count of an item """
        sl = SortedList()
        sl.extend([0, 4, 3, 4, 3, 4, 10, 4, 10, 3])

        self.assertEqual(sl.count(4), 4)
        self.assertEqual(sl.count(3), 3)
        self.assertEqual(sl.count(0), 1)
        self.assertEqual(sl.count(2000), 0)
    def test_index(self):
        """ Test if returns the index of an item """
        sl = SortedList()
        self.assertRaises(ValueError, sl.index, 0)

        sl.extend([0, 1, 1, 10, 1, 15, 20])
        self.assertEqual(sl.index(0), 0)
        self.assertEqual(sl.index(1), 1)

        self.assertEqual(sl.index(1, 3), 3)
        self.assertRaises(ValueError, sl.index, 10, 0, 3)
    def test_remove(self):
        """ Test if object removes items """
        sl = SortedList()
        sl.extend([0, 10, 20, -5, 10])

        sl.remove(0)
        self.assertEqual(sl.sequence, [-5, 10, 10, 20])

        sl.remove(10)
        self.assertEqual(sl.sequence, [-5, 10, 20])
        sl.remove(10)
        self.assertEqual(sl.sequence, [-5, 20])

        self.assertRaises(ValueError, sl.remove, 10)
    def test_pop(self):
        """ Test if the object pops correctly """
        sl = SortedList()

        with self.assertRaises(IndexError):
            sl.pop()
            sl.pop(0)

        sl.add(5)
        self.assertEqual(sl.pop(), 5)

        sl.extend([6, 90, 3, 4, 9])

        self.assertEqual(sl.pop(), 90)
        self.assertEqual(sl.pop(0), 3)
        self.assertEqual(sl.sequence, [4, 6, 9])
    def test_extend(self):
        """ Test if object accepts an iterable
            and puts all of it's items in correct
            order """
        sl = SortedList()

        items = [3, 0, 1, 15]
        sl.extend(items)
        self.assertEqual(sorted(items), sl.sequence)

        more_items = [-5, 20, 3]
        sl.extend(more_items)
        self.assertEqual(sorted(items + more_items), sl.sequence)
        sl.extend([])
        self.assertEqual(sorted(items + more_items), sl.sequence)