import unittest2 from screenplain.richstring import ( RichString, Segment, Bold, Italic, plain, bold, italic, underline ) from screenplain.richstring import parse_emphasis from screenplain.types import Slug, Action, Dialog, DualDialog, Transition class LowLevelRichStringTests(unittest2.TestCase): def test_plain_string_has_one_single_segment(self): s = RichString(plain('hello')) self.assertEqual((plain('hello'),), s.segments) class RichStringOperatorTests(unittest2.TestCase): def test_repr(self): s = bold('Hello') + plain(' there ') + bold('folks') self.assertEquals( "(bold)('Hello') + (plain)(' there ') + (bold)('folks')", repr(s) ) def test_eq(self): self.assertEquals(bold('Hello'), bold('Hello')) self.assertNotEquals(bold('Hello'), bold('Foo')) self.assertNotEquals(plain('Hello'), bold('Hello')) def test_ne(self): self.assertFalse(bold('Hello') != bold('Hello')) def test_concatenating_two_richstrings(self): expected = RichString(Segment('hello', ()), Segment(' there', (Bold,))) s1 = plain('hello') s2 = bold(' there') result = s1 + s2 self.assertEquals(expected, result) class StyleGeneratorTests(unittest2.TestCase): def test_bold_function_creates_bold_richstring(self): self.assertEquals( RichString(Segment('a', (Bold,))), bold('a') ) def test_adding_functions(self): self.assertEquals( RichString(Segment('a', (Bold, Italic))), (bold + italic)('a') ) class RichStringTests(unittest2.TestCase): def test_plain_to_html(self): self.assertEquals('hello', RichString(plain('hello')).to_html()) def test_to_html(self): s = RichString( bold('bold'), plain(' normal '), italic('italic'), underline('wonderline') ) self.assertEquals( 'bold normal italicwonderline', s.to_html() ) class ParseEmphasisTests(unittest2.TestCase): def test_parse_without_emphasis(self): self.assertEquals(plain('Hello'), parse_emphasis('Hello'), 'Expected parse_emphasis to return a plain string') def test_parse_bold(self): self.assertEquals( parse_emphasis('**Hello**'), bold('Hello') ) def test_parse_pre_and_postfix_and_bold(self): self.assertEquals( parse_emphasis('pre**Hello**post'), plain('pre') + bold('Hello') + plain('post') ) def test_parse_multiple_bold(self): self.assertEquals( parse_emphasis('x**Hello** **there**'), plain('x') + bold('Hello') + plain(' ') + bold('there') ) def test_parse_adjacent_bold(self): self.assertEquals( parse_emphasis('**123**456**'), bold('123') + plain('456**') ) def test_italic(self): self.assertEquals( parse_emphasis('*Italian style*'), italic('Italian style') ) def test_bold_inside_italic(self): self.assertEquals( parse_emphasis('*Swedish **style** rules*'), italic('Swedish ') + (bold + italic)('style') + italic(' rules') ) def test_italic_inside_bold(self): self.assertEquals( parse_emphasis('**Swedish *style* rules**'), bold('Swedish ') + (bold + italic)('style') + bold(' rules') ) def test_italic_and_bold(self): self.assertEquals( parse_emphasis('***really strong***'), (bold + italic)('really strong') ) @unittest2.expectedFailure def test_additional_star(self): self.assertEquals( parse_emphasis('*foo* bar* baz'), italic('foo') + plain(' bar* baz') ) def test_underline(self): self.assertEquals( parse_emphasis('_hello_'), underline('hello') ) def test_bold_inside_underline(self): self.assertEquals( parse_emphasis('_**hello**_'), (bold + underline)('hello') ) def test_overlapping_underscore_and_italic(self): # It's unclear what result to expect in this case. # This is one way of interpreting it self.assertEquals( parse_emphasis('_*he_llo*'), (italic + underline)('he') + italic('llo') )