Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use deque instead of lists for character stacks #19

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 3 additions & 2 deletions shakespearelang/_character.py
@@ -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
@@ -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