Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions shakespearelang/_character.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from collections import deque

from .errors import ShakespeareRuntimeError
from ._utils import normalize_name


class Character:
"""A character in an SPL play."""

def __init__(self):
self.value = 0
self.stack = []
self.stack = deque()

def __str__(self):
return f'{self.value} ({" ".join([str(v) for v in self.stack][::-1])})'
Expand Down
72 changes: 37 additions & 35 deletions shakespearelang/tests/test_stacks.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from collections import deque

from shakespearelang import Shakespeare
from shakespearelang.errors import ShakespeareRuntimeError
import pytest
Expand All @@ -16,19 +18,19 @@ def test_push():
s.run_event("[Enter Romeo and Juliet]")

c = s.state.character_by_name("Juliet")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 0

s.run_sentence("Remember a furry animal.", "Romeo")
assert c.stack == [2]
assert c.stack == deque([2])
assert c.value == 0

s.run_sentence("Remember a furry furry animal.", "Romeo")
assert c.stack == [2, 4]
assert c.stack == deque([2, 4])
assert c.value == 0

s.run_sentence("Remember a furry furry furry animal.", "Romeo")
assert c.stack == [2, 4, 8]
assert c.stack == deque([2, 4, 8])
assert c.value == 0


Expand All @@ -37,21 +39,21 @@ def test_pop():
s.run_event("[Enter Romeo and Juliet]")

c = s.state.character_by_name("Juliet")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 0

c.stack = [234, 123, 678]
c.stack = deque([234, 123, 678])

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234, 123]
assert c.stack == deque([234, 123])
assert c.value == 678

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234]
assert c.stack == deque([234])
assert c.value == 123

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 234


Expand All @@ -60,53 +62,53 @@ def test_sequence():
s.run_event("[Enter Romeo and Juliet]")

c = s.state.character_by_name("Juliet")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 0

c.stack = [234, 123, 678]
c.stack = deque([234, 123, 678])

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234, 123]
assert c.stack == deque([234, 123])
assert c.value == 678

s.run_sentence("Remember a furry animal.", "Romeo")
assert c.stack == [234, 123, 2]
assert c.stack == deque([234, 123, 2])
assert c.value == 678

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234, 123]
assert c.stack == deque([234, 123])
assert c.value == 2

s.run_sentence("Remember a furry furry animal.", "Romeo")
assert c.stack == [234, 123, 4]
assert c.stack == deque([234, 123, 4])
assert c.value == 2

s.run_sentence("Remember a furry furry furry animal.", "Romeo")
assert c.stack == [234, 123, 4, 8]
assert c.stack == deque([234, 123, 4, 8])
assert c.value == 2

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234, 123, 4]
assert c.stack == deque([234, 123, 4])
assert c.value == 8

s.run_sentence("Remember a furry furry furry furry animal.", "Romeo")
assert c.stack == [234, 123, 4, 16]
assert c.stack == deque([234, 123, 4, 16])
assert c.value == 8

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234, 123, 4]
assert c.stack == deque([234, 123, 4])
assert c.value == 16

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234, 123]
assert c.stack == deque([234, 123])
assert c.value == 4

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234]
assert c.stack == deque([234])
assert c.value == 123

s.run_sentence("Recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 234


Expand All @@ -115,7 +117,7 @@ def test_errors_on_pop_from_empty():
s.run_event("[Enter Romeo and Juliet]")

c = s.state.character_by_name("Juliet")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 0

with pytest.raises(ShakespeareRuntimeError) as exc:
Expand All @@ -124,7 +126,7 @@ def test_errors_on_pop_from_empty():
assert ">>Recall thy terrible memory of thy imminent death.<<" in str(exc.value)
assert exc.value.interpreter == s

assert c.stack == []
assert c.stack == deque([])
assert c.value == 0


Expand All @@ -133,27 +135,27 @@ def test_conditional_push():
s.run_event("[Enter Romeo and Juliet]")

c = s.state.character_by_name("Juliet")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 0

s.state.global_boolean = False
s.run_sentence("If so, remember a furry animal.", "Romeo")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 0

s.state.global_boolean = True
s.run_sentence("If not, remember a furry animal.", "Romeo")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 0

s.state.global_boolean = True
s.run_sentence("If so, remember a furry animal.", "Romeo")
assert c.stack == [2]
assert c.stack == deque([2])
assert c.value == 0

s.state.global_boolean = False
s.run_sentence("If not, remember a furry furry animal.", "Romeo")
assert c.stack == [2, 4]
assert c.stack == deque([2, 4])
assert c.value == 0


Expand All @@ -162,27 +164,27 @@ def test_conditional_pop():
s.run_event("[Enter Romeo and Juliet]")

c = s.state.character_by_name("Juliet")
assert c.stack == []
assert c.stack == deque([])
assert c.value == 0

c.stack = [234, 123, 678]
c.stack = deque([234, 123, 678])

s.state.global_boolean = False
s.run_sentence("If so, recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234, 123, 678]
assert c.stack == deque([234, 123, 678])
assert c.value == 0

s.state.global_boolean = True
s.run_sentence("If not, recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234, 123, 678]
assert c.stack == deque([234, 123, 678])
assert c.value == 0

s.state.global_boolean = True
s.run_sentence("If so, recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234, 123]
assert c.stack == deque([234, 123])
assert c.value == 678

s.state.global_boolean = False
s.run_sentence("If not, recall thy terrible memory of thy imminent death.", "Romeo")
assert c.stack == [234]
assert c.stack == deque([234])
assert c.value == 123