def test_parse_strings_no_terminating_delimiter(self): text = '(foo' with self.assertRaisesRegex( MacroParsingError, re.escape("No closing bracket: {}".format(text))): parse_strings(text) text = '{foo)' with self.assertRaisesRegex( MacroParsingError, re.escape("No closing bracket: {}".format(text))): parse_strings(text) text = '[foo}' with self.assertRaisesRegex( MacroParsingError, re.escape("No closing bracket: {}".format(text))): parse_strings(text) text = '/foo,bar/' with self.assertRaisesRegex( MacroParsingError, "No terminating delimiter: {}".format(text)): parse_strings(text) text = '//foo/bar/' with self.assertRaisesRegex( MacroParsingError, "No terminating delimiter: {}".format(text)): parse_strings(text)
def test_parse_strings_too_many_parameters(self): text = '(foo,bar,baz)' with self.assertRaises(TooManyParametersError) as cm: parse_strings(text, num=2) self.assertEqual( cm.exception.args[0], "Too many parameters (expected 2): '{}'".format(text[1:-1])) self.assertEqual(cm.exception.args[1], len(text))
def test_parse_strings_missing_parameters(self): text = '(foo,bar)' with self.assertRaises(MissingParameterError) as cm: parse_strings(text, num=3) self.assertEqual(cm.exception.args[0], "Not enough parameters (expected 3): '{}'".format(text[1:-1])) self.assertEqual(cm.exception.args[1], len(text)) text = '{foo,bar}' with self.assertRaises(MissingParameterError) as cm: parse_strings(text, num=5, defaults=('qux',)) self.assertEqual(cm.exception.args[0], "Not enough parameters (expected 4): '{}'".format(text[1:-1])) self.assertEqual(cm.exception.args[1], len(text))
def test_parse_strings_missing_parameters(self): text = '(foo,bar)' with self.assertRaises(MissingParameterError) as cm: parse_strings(text, num=3) self.assertEqual( cm.exception.args[0], "Not enough parameters (expected 3): '{}'".format(text[1:-1])) self.assertEqual(cm.exception.args[1], len(text)) text = '{foo,bar}' with self.assertRaises(MissingParameterError) as cm: parse_strings(text, num=5, defaults=('qux', )) self.assertEqual( cm.exception.args[0], "Not enough parameters (expected 4): '{}'".format(text[1:-1])) self.assertEqual(cm.exception.args[1], len(text))
def _get_text_width(self, template_name, **subs): template = self.templates[template_name] text_f = '{text' if text_f in template: text_f = skoolmacro.parse_strings(template, template.index(text_f), 1)[1] return self.line_width - len( template.replace(text_f, 'text').format(text='', **subs))
def test_parse_strings_no_terminating_delimiter(self): text = '(foo' with self.assertRaisesRegex(MacroParsingError, re.escape("No closing bracket: {}".format(text))): parse_strings(text) text = '{foo)' with self.assertRaisesRegex(MacroParsingError, re.escape("No closing bracket: {}".format(text))): parse_strings(text) text = '[foo}' with self.assertRaisesRegex(MacroParsingError, re.escape("No closing bracket: {}".format(text))): parse_strings(text) text = '/foo,bar/' with self.assertRaisesRegex(MacroParsingError, "No terminating delimiter: {}".format(text)): parse_strings(text) text = '//foo/bar/' with self.assertRaisesRegex(MacroParsingError, "No terminating delimiter: {}".format(text)): parse_strings(text)
def test_parse_strings_no_parameters(self): msg = "No text parameter" with self.assertRaisesRegex(NoParametersError, msg): parse_strings('') with self.assertRaisesRegex(NoParametersError, msg): parse_strings(' (') with self.assertRaisesRegex(NoParametersError, msg): parse_strings('\t{')
def test_parse_strings(self): # One string, blank self.assertEqual((2, ''), parse_strings('()', num=1)) self.assertEqual((2, ''), parse_strings('{}', num=1)) self.assertEqual((2, ''), parse_strings('[]', num=1)) self.assertEqual((2, ''), parse_strings('//', num=1)) self.assertEqual((2, ''), parse_strings('||', num=1)) # One string, not blank self.assertEqual((5, 'foo'), parse_strings('(foo)', num=1)) self.assertEqual((5, 'bar'), parse_strings('{bar}', num=1)) self.assertEqual((5, 'baz'), parse_strings('[baz]', num=1)) self.assertEqual((5, 'qux'), parse_strings('/qux/', num=1)) self.assertEqual((7, 'xyzzy'), parse_strings('|xyzzy|', num=1)) # One string, containing commas self.assertEqual((9, 'foo,bar'), parse_strings('(foo,bar)', num=1)) self.assertEqual((13, 'bar,baz,qux'), parse_strings('{bar,baz,qux}', num=1)) self.assertEqual((13, 'baz,qux,y,z'), parse_strings('[baz,qux,y,z]', num=1)) self.assertEqual((9, 'qux,yyy'), parse_strings('/qux,yyy/', num=1)) self.assertEqual((9, 'yyy,zzz'), parse_strings('|yyy,zzz|', num=1)) # Two strings self.assertEqual((9, ['foo', 'bar']), parse_strings('(foo,bar)', num=2)) self.assertEqual((9, ['foo', 'bar']), parse_strings('{foo,bar}', num=2)) self.assertEqual((9, ['foo', 'bar']), parse_strings('[foo,bar]', num=2)) self.assertEqual((11, ['foo', 'bar']), parse_strings('/,foo,bar,/', num=2)) self.assertEqual((11, ['foo', 'bar']), parse_strings('||foo|bar||', num=2)) # Three strings, default values self.assertEqual((2, ['', 'bar', 'baz']), parse_strings('()', num=3, defaults=('bar', 'baz'))) self.assertEqual((5, ['foo', 'bar', 'baz']), parse_strings('{foo}', num=3, defaults=('bar', 'baz'))) self.assertEqual((9, ['foo', 'bar', 'baz']), parse_strings('[foo,bar]', num=3, defaults=('baz', ))) self.assertEqual((8, ['foo', '', 'baz']), parse_strings(':;foo;;:', num=3, defaults=('bim', 'baz'))) # Unlimited strings self.assertEqual((2, ['']), parse_strings('()', num=0)) self.assertEqual((5, ['foo']), parse_strings('(foo)', num=0)) self.assertEqual((9, ['foo', 'bar']), parse_strings('{foo,bar}', num=0)) self.assertEqual((13, ['foo', 'bar', 'baz']), parse_strings('[foo,bar,baz]', num=0)) self.assertEqual((19, ['foo', 'bar', 'baz', 'qux']), parse_strings('/ foo bar baz qux /', num=0)) self.assertEqual((19, ['foo', '', 'baz', '', 'xyzzy']), parse_strings('|;foo;;baz;;xyzzy;|', num=0))
def test_parse_strings_too_many_parameters(self): text = '(foo,bar,baz)' with self.assertRaises(TooManyParametersError) as cm: parse_strings(text, num=2) self.assertEqual(cm.exception.args[0], "Too many parameters (expected 2): '{}'".format(text[1:-1])) self.assertEqual(cm.exception.args[1], len(text))
def test_parse_strings(self): # One string, blank self.assertEqual((2, ''), parse_strings('()', num=1)) self.assertEqual((2, ''), parse_strings('{}', num=1)) self.assertEqual((2, ''), parse_strings('[]', num=1)) self.assertEqual((2, ''), parse_strings('//', num=1)) self.assertEqual((2, ''), parse_strings('||', num=1)) # One string, not blank self.assertEqual((5, 'foo'), parse_strings('(foo)', num=1)) self.assertEqual((5, 'bar'), parse_strings('{bar}', num=1)) self.assertEqual((5, 'baz'), parse_strings('[baz]', num=1)) self.assertEqual((5, 'qux'), parse_strings('/qux/', num=1)) self.assertEqual((7, 'xyzzy'), parse_strings('|xyzzy|', num=1)) # Two strings self.assertEqual((9, ['foo', 'bar']), parse_strings('(foo,bar)', num=2)) self.assertEqual((9, ['foo', 'bar']), parse_strings('{foo,bar}', num=2)) self.assertEqual((9, ['foo', 'bar']), parse_strings('[foo,bar]', num=2)) self.assertEqual((11, ['foo', 'bar']), parse_strings('/,foo,bar,/', num=2)) self.assertEqual((11, ['foo', 'bar']), parse_strings('||foo|bar||', num=2)) # Three strings, default values self.assertEqual((2, ['', 'bar', 'baz']), parse_strings('()', num=3, defaults=('bar', 'baz'))) self.assertEqual((5, ['foo', 'bar', 'baz']), parse_strings('{foo}', num=3, defaults=('bar', 'baz'))) self.assertEqual((9, ['foo', 'bar', 'baz']), parse_strings('[foo,bar]', num=3, defaults=('baz',))) self.assertEqual((8, ['foo', '', 'baz']), parse_strings(':;foo;;:', num=3, defaults=('bim', 'baz'))) # Unlimited strings self.assertEqual((2, ['']), parse_strings('()', num=0)) self.assertEqual((5, ['foo']), parse_strings('(foo)', num=0)) self.assertEqual((9, ['foo', 'bar']), parse_strings('{foo,bar}', num=0)) self.assertEqual((13, ['foo', 'bar', 'baz']), parse_strings('[foo,bar,baz]', num=0)) self.assertEqual((19, ['foo', 'bar', 'baz', 'qux']), parse_strings('/ foo bar baz qux /', num=0)) self.assertEqual((19, ['foo', '', 'baz', '', 'xyzzy']), parse_strings('|;foo;;baz;;xyzzy;|', num=0))
def parse_s(text, index, case): end, s = parse_strings(text, index, 1) return end, s.lower() if case == 1 else s