def test_undo_insert():
    ls = []
    undo_stack = []
    Commands.insert(ls, cn(1), 0, undo=undo_stack)
    assert (len(undo_stack) == 1)
    Commands.insert(ls, cn(2), 1, undo=undo_stack)
    assert (len(undo_stack) == 2)
    Commands.undo(ls, undo_stack)
    assert (len(undo_stack) == 1)
    assert (ls == [cn(1)])
    Commands.undo(ls, undo_stack)
    assert (ls == [])
def test_undo_filter_real():
    ls = []
    undo_stack = []
    Commands.add(ls, cn(2))
    Commands.add(ls, cn(3))
    Commands.add(ls, cn(2j))
    Commands.add(ls, cn(1j))
    Commands.filter_real(ls, undo=undo_stack)
    assert (ls == [cn(2), cn(3)])
    assert (len(undo_stack) == 2)
    Commands.undo(ls, undo_stack)
    assert (ls == [cn(2), cn(3), cn(2j), cn(1j)])
    assert (len(undo_stack) == 0)
def test_undo_filter_modulo():
    ls = []
    undo_stack = []
    Commands.add(ls, cn(2))
    Commands.add(ls, cn(3))
    Commands.add(ls, cn(2j))
    Commands.add(ls, cn(1j))
    Commands.filter_modulo(ls, float.__lt__, 2.0, undo=undo_stack)
    assert (ls == [cn(1j)])
    assert (len(undo_stack) == 3)
    Commands.undo(ls, undo_stack)
    assert (ls == [cn(2), cn(3), cn(2j), cn(1j)])
    assert (len(undo_stack) == 0)
def test_undo_add():
    ls = []
    undo_stack = []
    Commands.add(ls, cn(1), undo=undo_stack)
    assert (len(undo_stack) == 1)
    Commands.undo(ls, undo_stack)
    assert (len(undo_stack) == 0)
    assert (ls == [])
def test_undo_remove():
    ls = []
    undo_stack = []
    Commands.add(ls, cn(1))
    Commands.add(ls, cn(2))
    Commands.add(ls, cn(3))
    assert (len(ls) == 3)
    assert (undo_stack == [])
    Commands.remove(ls, 0, 0, undo=undo_stack)
    assert (len(undo_stack) == 1)
    assert (ls == [cn(2), cn(3)])
    Commands.remove(ls, 0, 1, undo=undo_stack)
    assert (len(undo_stack) == 3)
    assert (ls == [])
    Commands.undo(ls, undo_stack)
    assert (ls == [cn(2), cn(3)])
    assert (len(undo_stack) == 1)
    Commands.undo(ls, undo_stack)
    assert (ls == [cn(1), cn(2), cn(3)])
    assert (len(undo_stack) == 0)
def add():
    assert (Commands.add([], cn(2j)) == [cn(2j)])
    assert (Commands.add([cn(1 + 2j), cn(3j)],
                         cn(-2j)) == [cn(1 + 2j), cn(3j),
                                      cn(-2j)])
    assert (Commands.add([cn(1 + 2j), cn(3j)],
                         cn(2)) == [cn(1 + 2j), cn(3j),
                                    cn(2)])
    assert (Commands.add([cn(3)], cn(2)) == [cn(3), cn(2)])
    assert (has_help("add"))
def list_real_range():
    assert (Commands.list_real_range(
        [cn(1), cn(2j), cn(3), cn(4), cn(5)], 0, 3) == [cn(1),
                                                        cn(3),
                                                        cn(4)])
    assert (Commands.list_real_range(
        [cn(2j), cn(3j), cn(4j), cn(3 + 5j),
         cn(-6j)], 0, 4) == [])
    assert (Commands.list_real_range(
        [cn(1), cn(2), cn(3), cn(4), cn(5)], 0,
        4) == [cn(1), cn(2), cn(3), cn(4), cn(5)])
    assert (Commands.list_real_range(
        [cn(1 + 1j), cn(3 + 4j),
         cn(2), cn(4 + 3j), cn(5j)], 1, 2) == [cn(2)])
def sum():
    assert (ComplexNumber.add(cn(1), cn(2j)) == cn(1 + 2j))
    assert (ComplexNumber.add(cn(-1), cn(2j)) == cn(-1 + 2j))
    assert (ComplexNumber.add(cn(2j), cn(2j)) == cn(4j))
def sums():
    assert (Commands.sums([cn(1)], 0, 1) == cn(1))
    assert (Commands.sums([], 0, 0) == cn(0))
    assert (Commands.sums([cn(1), cn(2), cn(3)], 1, 1) == cn(2))
    assert (has_help("sum"))
def list_modulo():
    assert (Commands.list_modulo(
        [cn(1), cn(2), cn(3), cn(4), cn(5)], float.__gt__,
        2.0) == [cn(3), cn(4), cn(5)])
    assert (Commands.list_modulo(
        [cn(1), cn(2), cn(3), cn(4), cn(5)], float.__lt__,
        4.0) == [cn(1), cn(2), cn(3)])
    assert (Commands.list_modulo(
        [cn(1), cn(2), cn(3), cn(4), cn(5)], float.__eq__, 2.0) == [cn(2)])
    assert (Commands.list_modulo(
        [cn(1 + 1j), cn(4 + 3j), cn(5j)], float.__eq__,
        5.0) == [cn(4 + 3j), cn(5j)])
def modulo():
    assert (ComplexNumber.modulo(cn(1)) == 1)
    assert (ComplexNumber.modulo(cn(2j)) == 2)
    assert (ComplexNumber.modulo(cn(3 + 4j)) == 5)
def lists():
    assert (Commands.lists([]) == [])
    assert (Commands.lists([cn(1), cn(2), cn(3)]) == [cn(1), cn(2), cn(3)])
    assert (Commands.lists([cn(2), cn(5), cn(2),
                            cn(2 + 1j)]) == [cn(2),
                                             cn(5),
                                             cn(2),
                                             cn(2 + 1j)])
    assert (Commands.lists([cn(3 + 5j), cn(3 - 5j),
                            cn(4)]) == [cn(3 + 5j),
                                        cn(3 - 5j),
                                        cn(4)])
    assert (has_help("list"))
def multiply():
    assert (ComplexNumber.multiply(cn(-1j), cn(1j)) == cn(1))
    assert (ComplexNumber.multiply(cn(1j), cn(1j)) == cn(-1))
    assert (ComplexNumber.multiply(cn(2 - 1j), cn(3 + 1j)) == cn(7 - 1j))
def product():
    assert (Commands.product([cn(1j), cn(1j)], 0, 1) == cn(-1))
    assert (Commands.product([cn(0), cn(1), cn(1j), cn(2j)], 1, 3) == cn(-2))
    assert (Commands.product(
        [cn(1 + 1j), cn(2 + 2j), cn(0), cn(1)], 1, 3) == cn(0))
    assert (Commands.product([cn(1 + 1j), cn(2 + 3j)], 0, 1) == cn(-1 + 5j))
    assert (has_help("product"))
def filter_modulo():
    assert (Commands.filter_modulo(
        [cn(1), cn(2), cn(1 + 2j), cn(3 + 1j)], float.__eq__, 2.0) == [cn(2)])
    assert (Commands.filter_modulo([cn(1)], float.__lt__, 2.0) == [cn(1)])
    assert (Commands.filter_modulo([cn(1 + 2j), cn(3 + 1j)], float.__gt__,
                                   3.0) == [cn(3 + 1j)])
def filter_real():
    assert (Commands.filter_real([cn(1), cn(2),
                                  cn(1 + 2j),
                                  cn(3 + 1j)]) == [cn(1), cn(2)])
    assert (Commands.filter_real([cn(1)]) == [cn(1)])
    assert (Commands.filter_real([cn(1 + 2j), cn(3 + 1j)]) == [])
def replace():
    assert (Commands.replace([cn(1), cn(2), cn(3)], cn(2),
                             cn(10)) == [cn(1), cn(10), cn(3)])
    assert (Commands.replace(
        [cn(1), cn(2), cn(2), cn(3), cn(2),
         cn(4)], cn(2), cn(5)) == [cn(1),
                                   cn(5),
                                   cn(5),
                                   cn(3),
                                   cn(5),
                                   cn(4)])
    assert (Commands.replace([cn(1), cn(2 + 3j), cn(3 + 2j)], cn(2 + 3j),
                             cn(3 + 2j)) == [cn(1),
                                             cn(3 + 2j),
                                             cn(3 + 2j)])
def test_undo_replace():
    ls = []
    undo_stack = []
    Commands.add(ls, cn(2))
    Commands.add(ls, cn(3))
    Commands.add(ls, cn(2))
    assert (ls == [cn(2), cn(3), cn(2)])
    Commands.replace(ls, cn(2), cn(10), undo=undo_stack)
    assert (len(undo_stack) == 4)
    assert (ls == [cn(10), cn(3), cn(10)])
    Commands.undo(ls, undo_stack)
    assert (len(undo_stack) == 0)
    assert (ls == [cn(2), cn(3), cn(2)])
def insert():
    assert (Commands.insert([], cn(1), 0) == [cn(1)])
    assert (Commands.insert([cn(1), cn(2), cn(3)], cn(5),
                            1) == [cn(1), cn(5), cn(2),
                                   cn(3)])
    assert (Commands.insert([cn(1), cn(2), cn(3)], cn(1),
                            2) == [cn(1), cn(2), cn(1),
                                   cn(3)])
    assert (Commands.insert([cn(1), cn(2), cn(3), cn(5)], cn(15),
                            2) == [cn(1), cn(2),
                                   cn(15), cn(3),
                                   cn(5)])
    assert (has_help("insert"))
def remove():
    assert (Commands.remove([cn(1), cn(2), cn(3), cn(4)], 0, 3) == [])
    assert (Commands.remove([cn(1), cn(2), cn(3), cn(4)], 0, 2) == [cn(4)])
    assert (Commands.remove([cn(1), cn(2), cn(3), cn(4)], 0,
                            0) == [cn(2), cn(3), cn(4)])
    assert (Commands.remove([cn(1), cn(2), cn(4)], 1, 1) == [cn(1), cn(4)])
    assert (has_help("remove"))
def format():
    assert (ComplexNumber.format(cn(1 + 2j)) == "1+2i")
    assert (ComplexNumber.format(cn(-10)) == "-10")
    assert (ComplexNumber.format(cn(2j)) == "2i")