summaryrefslogtreecommitdiff
path: root/tests/spmd_test.py
diff options
context:
space:
mode:
authorMartin Vilcans <martin@librador.com>2011-09-08 23:03:13 +0200
committerMartin Vilcans <martin@librador.com>2011-09-09 00:00:19 +0200
commit579fa278aeaa26dccbdfe28b4b5ce0db3390c0b8 (patch)
tree4059ba95886bea7f743b3f303176079ca1669069 /tests/spmd_test.py
parentf29785e72f42a6f9d6f69f031f00883348e91824 (diff)
Split code into more modules.
Diffstat (limited to 'tests/spmd_test.py')
-rw-r--r--tests/spmd_test.py152
1 files changed, 152 insertions, 0 deletions
diff --git a/tests/spmd_test.py b/tests/spmd_test.py
new file mode 100644
index 0000000..cb349a1
--- /dev/null
+++ b/tests/spmd_test.py
@@ -0,0 +1,152 @@
+import unittest2
+from screenplain.parsers.spmd import parse
+from screenplain.types import Slug, Action, Dialog, DualDialog, Transition
+
+class ParseTests(unittest2.TestCase):
+
+ # Without this, the @skip decorator gives
+ # AttributeError: 'ParseTests' object has no attribute '__name__'
+ __name__ = 'ParseTests'
+
+ # A Scene Heading, or "slugline," is any line that has a blank
+ # line following it, and either begins with INT or EXT, or has
+ # two empty lines preceding it. A Scene Heading always has at
+ # least one blank line preceding it.
+ # NOTE: Actually the list used in Appendix 1
+ def test_slug_with_prefix(self):
+ paras = list(parse([
+ 'INT. SOMEWHERE - DAY',
+ '',
+ 'THIS IS JUST ACTION',
+ ]))
+ self.assertEquals([Slug, Action], [type(p) for p in paras])
+
+ def test_action_is_not_a_slug(self):
+ paras = list(parse([
+ '',
+ 'THIS IS JUST ACTION',
+ ]))
+ self.assertEquals([Action], [type(p) for p in paras])
+
+ def test_two_lines_creates_a_slug(self):
+ types = [type(p) for p in parse([
+ '',
+ '',
+ 'This is a slug',
+ '',
+ ])]
+ self.assertEquals([Slug], types)
+
+ # A Character element is any line entirely in caps, with one empty
+ # line before it and without an empty line after it.
+ def test_all_caps_is_character(self):
+ paras = [p for p in parse([
+ 'SOME GUY',
+ 'Hello',
+ ])]
+ self.assertEquals(1, len(paras))
+ dialog = paras[0]
+ self.assertEquals(Dialog, type(dialog))
+ self.assertEquals('SOME GUY', dialog.character)
+
+ # SPMD would not be able to support a character named "23". We
+ # might need a syntax to force a character element.
+ def test_nonalpha_character(self):
+ paras = list(parse([
+ '23',
+ 'Hello',
+ ]))
+ self.assertEquals([Action], [type(p) for p in paras])
+
+ # See
+ # http://prolost.com/storage/downloads/spmd/SPMD_proposal.html#section-br
+ def test_twospaced_line_is_not_character(self):
+ paras = list(parse([
+ 'SCANNING THE AISLES... ',
+ 'Where is that pit boss?',
+ ]))
+ self.assertEquals([Action], [type(p) for p in paras])
+
+ def test_simple_parenthetical(self):
+ paras = list(parse([
+ 'STEEL',
+ '(starting the engine)',
+ 'So much for retirement!',
+ ]))
+ self.assertEquals(1, len(paras))
+ dialog = paras[0]
+ self.assertEqual(2, len(dialog.blocks))
+ self.assertEqual((True, '(starting the engine)'), dialog.blocks[0])
+ self.assertEqual((False, 'So much for retirement!'), dialog.blocks[1])
+
+ def test_dual_dialog(self):
+ paras = list(parse([
+ 'BRICK',
+ 'Fuck retirement.',
+ '||',
+ 'STEEL',
+ 'Fuck retirement!',
+ ]))
+ self.assertEquals([DualDialog], [type(p) for p in paras])
+ dual = paras[0]
+ self.assertEquals('BRICK', dual.left.character)
+ self.assertEquals([(False, 'Fuck retirement.')], dual.left.blocks)
+ self.assertEquals('STEEL', dual.right.character)
+ self.assertEquals([(False, 'Fuck retirement!')], dual.right.blocks)
+
+ def test_standard_transition(self):
+
+ paras = list(parse([
+ 'Jack begins to argue vociferously in Vietnamese (?)',
+ '',
+ 'CUT TO:',
+ '',
+ "EXT. BRICK'S POOL - DAY",
+ ]))
+ self.assertEquals([Action, Transition, Slug], [type(p) for p in paras])
+
+ def test_standard_transition(self):
+
+ paras = list(parse([
+ 'Jack begins to argue vociferously in Vietnamese (?)',
+ '',
+ 'CUT TO:',
+ '',
+ "EXT. BRICK'S POOL - DAY",
+ ]))
+ self.assertEquals([Action, Transition, Slug], [type(p) for p in paras])
+
+ def test_transition_needs_to_be_upper_case(self):
+ paras = list(parse([
+ 'Jack begins to argue vociferously in Vietnamese (?)',
+ '',
+ 'cut to:',
+ '',
+ "EXT. BRICK'S POOL - DAY",
+ ]))
+ self.assertEquals([Action, Action, Slug], [type(p) for p in paras])
+
+ def test_not_a_transition_on_trailing_whitespace(self):
+ paras = list(parse([
+ 'Jack begins to argue vociferously in Vietnamese (?)',
+ '',
+ 'CUT TO: ',
+ '',
+ "EXT. BRICK'S POOL - DAY",
+ ]))
+ self.assertEquals([Action, Action, Slug], [type(p) for p in paras])
+
+ # Not implemented yet
+ @unittest2.expectedFailure
+ def test_transition_must_be_followed_by_slug(self):
+ paras = list(parse([
+ 'Bill lights a cigarette.',
+ '',
+ 'CUT TO:',
+ '',
+ 'SOME GUY mowing the lawn.',
+ ]))
+ self.assertEquals([Action, Action, Action], [type(p) for p in paras])
+
+if __name__ == '__main__':
+ unittest2.main()