Module grscheller.datastructures.tests.stack_test

Expand source code
from grscheller.datastructures.stack import Stack
from grscheller.datastructures.functional import Maybe, Nothing

class TestStack:
    def test_push_then_pop(self):
        s1 = Stack()
        pushed = 42; s1.push(pushed)
        popped = s1.pop().getOrElse(())
        assert pushed == popped == 42

    def test_pop_from_empty_stack(self):
        s1 = Stack()
        popped = s1.pop().getOrElse(())
        assert popped is ()
        assert popped is not None
        popped = s1.pop().getOrElse('Forty-Two')
        assert popped == 'Forty-Two'

        s2 = Stack(1, 2, 3, 42)
        while not s2.isEmpty():
            assert s2.head().getOrElse() is not Nothing
            s2.pop()
        assert s2.isEmpty()
        assert s2.pop() is Nothing

    def test_stack_len(self):
        s0 = Stack()
        s1 = Stack(*range(0,2000))

        assert len(s0) == 0
        assert len(s1) == 2000
        s0.push(42)
        s1.pop()
        s1.pop()
        assert len(s0) == 1
        assert len(s1) == 1998

    def test_tail(self):
        s1 = Stack()
        s1.push("fum").push("fo").push("fi").push("fe")
        ms2 = s1.tail()
        assert ms2 is not Nothing
        ms4 = ms2.map(lambda x: x.copy())
        assert ms4 == ms2
        assert ms4.flatMap(lambda x: Maybe(x.tail())) == ms2.map(lambda x: x.tail())
        assert ms4.getOrElse(Stack(*[1, 2, 3])) == ms2.getOrElse(Stack(*[3, 2, 1])) 
        while not s1.isEmpty():
            s1.pop()
        assert s1.pop() is Nothing
        assert s1.tail() is Nothing

    def test_stack_iter(self):
        giantStack = Stack(*reversed(["Fe", " Fi", " Fo", " Fum"]))
        giantTalk = giantStack.head().getOrElse("Teeny Tiny")
        assert giantTalk == "Fe"
        generalThumb = ['I', ' am', ' General', ' Tom', ' Thumb.']
        gs = giantStack.tail().getOrElse(Stack(*reversed(generalThumb)))
        for giantWord in gs:
            giantTalk = giantTalk + giantWord
        assert len(giantStack) == 4
        assert giantTalk == "Fe Fi Fo Fum"

    def test_equality(self):
        s1 = Stack(*range(3))
        s2 = s1.cons(42)
        assert s1 is not s2
        assert s1 is not s2.tail().getOrElse(Stack())
        assert s1 != s2
        assert s1 == s2.tail().getOrElse(Stack())

        assert s2.head().getOrElse(7) == 42
        assert s2.pop().getOrElse(0) == 42

        s3 = Stack(range(10000))
        s4 = s3.copy()
        assert s3 is not s4
        assert s3 == s4
        
        s3.push(s4.pop().getOrElse(-1))
        assert s3 is not s4
        assert s3 != s4
        s3.pop()
        s3.pop()
        assert s3 == s4

        s5 = Stack(*[1,2,3,4])
        s6 = Stack(*[1,2,3,42])
        assert s5 != s6
        for aa in range(10):
            s5.push(aa)
            s6.push(aa)
        assert s5 != s6

        ducks = ["huey", "dewey"]
        s7 = Stack(ducks)
        s8 = Stack(ducks)
        s9 = Stack(["huey", "dewey", "louie"])
        assert s7 == s8
        assert s7 != s9
        assert s7.head() == s8.head()
        assert s7.head() is not s8.head()
        assert s7.head() != s9.head()
        assert s7.head() is not s9.head()
        ducks.append("louie")
        assert s7 == s8
        assert s7 == s9
        s7.push(['moe', 'larry', 'curlie'])
        s8.push(['moe', 'larry'])
        assert s7 != s8
        s8.head().getOrElse([]).append("curlie")
        assert s7 == s8

    def test_doNotStoreNones(self):
        s10 = Stack()
        s10.push(None)
        s10.push(None)
        s10.push(None)
        s10.push(42)
        s10.push(None)
        assert len(s10) == 1
        s10.pop()
        assert s10.isEmpty()

Classes

class TestStack
Expand source code
class TestStack:
    def test_push_then_pop(self):
        s1 = Stack()
        pushed = 42; s1.push(pushed)
        popped = s1.pop().getOrElse(())
        assert pushed == popped == 42

    def test_pop_from_empty_stack(self):
        s1 = Stack()
        popped = s1.pop().getOrElse(())
        assert popped is ()
        assert popped is not None
        popped = s1.pop().getOrElse('Forty-Two')
        assert popped == 'Forty-Two'

        s2 = Stack(1, 2, 3, 42)
        while not s2.isEmpty():
            assert s2.head().getOrElse() is not Nothing
            s2.pop()
        assert s2.isEmpty()
        assert s2.pop() is Nothing

    def test_stack_len(self):
        s0 = Stack()
        s1 = Stack(*range(0,2000))

        assert len(s0) == 0
        assert len(s1) == 2000
        s0.push(42)
        s1.pop()
        s1.pop()
        assert len(s0) == 1
        assert len(s1) == 1998

    def test_tail(self):
        s1 = Stack()
        s1.push("fum").push("fo").push("fi").push("fe")
        ms2 = s1.tail()
        assert ms2 is not Nothing
        ms4 = ms2.map(lambda x: x.copy())
        assert ms4 == ms2
        assert ms4.flatMap(lambda x: Maybe(x.tail())) == ms2.map(lambda x: x.tail())
        assert ms4.getOrElse(Stack(*[1, 2, 3])) == ms2.getOrElse(Stack(*[3, 2, 1])) 
        while not s1.isEmpty():
            s1.pop()
        assert s1.pop() is Nothing
        assert s1.tail() is Nothing

    def test_stack_iter(self):
        giantStack = Stack(*reversed(["Fe", " Fi", " Fo", " Fum"]))
        giantTalk = giantStack.head().getOrElse("Teeny Tiny")
        assert giantTalk == "Fe"
        generalThumb = ['I', ' am', ' General', ' Tom', ' Thumb.']
        gs = giantStack.tail().getOrElse(Stack(*reversed(generalThumb)))
        for giantWord in gs:
            giantTalk = giantTalk + giantWord
        assert len(giantStack) == 4
        assert giantTalk == "Fe Fi Fo Fum"

    def test_equality(self):
        s1 = Stack(*range(3))
        s2 = s1.cons(42)
        assert s1 is not s2
        assert s1 is not s2.tail().getOrElse(Stack())
        assert s1 != s2
        assert s1 == s2.tail().getOrElse(Stack())

        assert s2.head().getOrElse(7) == 42
        assert s2.pop().getOrElse(0) == 42

        s3 = Stack(range(10000))
        s4 = s3.copy()
        assert s3 is not s4
        assert s3 == s4
        
        s3.push(s4.pop().getOrElse(-1))
        assert s3 is not s4
        assert s3 != s4
        s3.pop()
        s3.pop()
        assert s3 == s4

        s5 = Stack(*[1,2,3,4])
        s6 = Stack(*[1,2,3,42])
        assert s5 != s6
        for aa in range(10):
            s5.push(aa)
            s6.push(aa)
        assert s5 != s6

        ducks = ["huey", "dewey"]
        s7 = Stack(ducks)
        s8 = Stack(ducks)
        s9 = Stack(["huey", "dewey", "louie"])
        assert s7 == s8
        assert s7 != s9
        assert s7.head() == s8.head()
        assert s7.head() is not s8.head()
        assert s7.head() != s9.head()
        assert s7.head() is not s9.head()
        ducks.append("louie")
        assert s7 == s8
        assert s7 == s9
        s7.push(['moe', 'larry', 'curlie'])
        s8.push(['moe', 'larry'])
        assert s7 != s8
        s8.head().getOrElse([]).append("curlie")
        assert s7 == s8

    def test_doNotStoreNones(self):
        s10 = Stack()
        s10.push(None)
        s10.push(None)
        s10.push(None)
        s10.push(42)
        s10.push(None)
        assert len(s10) == 1
        s10.pop()
        assert s10.isEmpty()

Methods

def test_doNotStoreNones(self)
Expand source code
def test_doNotStoreNones(self):
    s10 = Stack()
    s10.push(None)
    s10.push(None)
    s10.push(None)
    s10.push(42)
    s10.push(None)
    assert len(s10) == 1
    s10.pop()
    assert s10.isEmpty()
def test_equality(self)
Expand source code
def test_equality(self):
    s1 = Stack(*range(3))
    s2 = s1.cons(42)
    assert s1 is not s2
    assert s1 is not s2.tail().getOrElse(Stack())
    assert s1 != s2
    assert s1 == s2.tail().getOrElse(Stack())

    assert s2.head().getOrElse(7) == 42
    assert s2.pop().getOrElse(0) == 42

    s3 = Stack(range(10000))
    s4 = s3.copy()
    assert s3 is not s4
    assert s3 == s4
    
    s3.push(s4.pop().getOrElse(-1))
    assert s3 is not s4
    assert s3 != s4
    s3.pop()
    s3.pop()
    assert s3 == s4

    s5 = Stack(*[1,2,3,4])
    s6 = Stack(*[1,2,3,42])
    assert s5 != s6
    for aa in range(10):
        s5.push(aa)
        s6.push(aa)
    assert s5 != s6

    ducks = ["huey", "dewey"]
    s7 = Stack(ducks)
    s8 = Stack(ducks)
    s9 = Stack(["huey", "dewey", "louie"])
    assert s7 == s8
    assert s7 != s9
    assert s7.head() == s8.head()
    assert s7.head() is not s8.head()
    assert s7.head() != s9.head()
    assert s7.head() is not s9.head()
    ducks.append("louie")
    assert s7 == s8
    assert s7 == s9
    s7.push(['moe', 'larry', 'curlie'])
    s8.push(['moe', 'larry'])
    assert s7 != s8
    s8.head().getOrElse([]).append("curlie")
    assert s7 == s8
def test_pop_from_empty_stack(self)
Expand source code
def test_pop_from_empty_stack(self):
    s1 = Stack()
    popped = s1.pop().getOrElse(())
    assert popped is ()
    assert popped is not None
    popped = s1.pop().getOrElse('Forty-Two')
    assert popped == 'Forty-Two'

    s2 = Stack(1, 2, 3, 42)
    while not s2.isEmpty():
        assert s2.head().getOrElse() is not Nothing
        s2.pop()
    assert s2.isEmpty()
    assert s2.pop() is Nothing
def test_push_then_pop(self)
Expand source code
def test_push_then_pop(self):
    s1 = Stack()
    pushed = 42; s1.push(pushed)
    popped = s1.pop().getOrElse(())
    assert pushed == popped == 42
def test_stack_iter(self)
Expand source code
def test_stack_iter(self):
    giantStack = Stack(*reversed(["Fe", " Fi", " Fo", " Fum"]))
    giantTalk = giantStack.head().getOrElse("Teeny Tiny")
    assert giantTalk == "Fe"
    generalThumb = ['I', ' am', ' General', ' Tom', ' Thumb.']
    gs = giantStack.tail().getOrElse(Stack(*reversed(generalThumb)))
    for giantWord in gs:
        giantTalk = giantTalk + giantWord
    assert len(giantStack) == 4
    assert giantTalk == "Fe Fi Fo Fum"
def test_stack_len(self)
Expand source code
def test_stack_len(self):
    s0 = Stack()
    s1 = Stack(*range(0,2000))

    assert len(s0) == 0
    assert len(s1) == 2000
    s0.push(42)
    s1.pop()
    s1.pop()
    assert len(s0) == 1
    assert len(s1) == 1998
def test_tail(self)
Expand source code
def test_tail(self):
    s1 = Stack()
    s1.push("fum").push("fo").push("fi").push("fe")
    ms2 = s1.tail()
    assert ms2 is not Nothing
    ms4 = ms2.map(lambda x: x.copy())
    assert ms4 == ms2
    assert ms4.flatMap(lambda x: Maybe(x.tail())) == ms2.map(lambda x: x.tail())
    assert ms4.getOrElse(Stack(*[1, 2, 3])) == ms2.getOrElse(Stack(*[3, 2, 1])) 
    while not s1.isEmpty():
        s1.pop()
    assert s1.pop() is Nothing
    assert s1.tail() is Nothing