class TestSExpressionParser(): def setUp(self): self.parser = SExpressionParser() def test_expression_one_word(self): assert_equal(self.parser.parse_expression('word'), 'word') def test_expression_empty_string(self): with assert_raises(ParseException): self.parser.parse_expression('') def test_expression_multiple_words(self): with assert_raises(ParseException): self.parser.parse_expression('two words') def test_expression_compound_empty(self): assert_equal(self.parser.parse_expression('()'), SExpression(())) def test_expression_compound_one_arg(self): assert_equal(self.parser.parse_expression('(foo)'), SExpression(('foo',))) def test_expression_compound_three_args(self): assert_equal(self.parser.parse_expression('(arg0 arg1 arg2)'), SExpression(('arg0', 'arg1', 'arg2'))) def test_expression_compound_nested_once(self): assert_equal(self.parser.parse_expression('((foo))'), SExpression((SExpression(('foo',)),))) def test_expression_compound_nested_deep(self): depth = 100 expected = 'foo' for _ in range(depth): expected = SExpression((expected,)) assert_equal( self.parser.parse_expression('(' * depth + 'foo' + ')' * depth), expected) def test_expression_compound_nested_complex(self): assert_equal(self.parser.parse_expression('((foo 1) (bar (baz 2)))'), SExpression((SExpression(('foo', '1')), SExpression(('bar', SExpression(('baz', '2')))))))