class TestQuotes(unittest.TestCase):
    def setUp(self):
        self.target = generator
        self.output = BaseIO()

    def test_single_quotes(self):
        self.target(BaseIO('\'abc "123" d d a\''), self.output)
        self.assertEqual('abc "123" d d a\n', self.output.getvalue())

    def test_nested_single_quotes(self):
        self.target(BaseIO('\'abc \\\'123\\\' d d a\''), self.output)
        self.assertEqual('abc \'123\' d d a\n', self.output.getvalue())

    def test_double_quotes(self):
        self.target(BaseIO('"abc \'123\' d d a"'), self.output)
        self.assertEqual('abc \'123\' d d a\n', self.output.getvalue())

    def test_nested_double_quotes(self):
        self.target(BaseIO('"abc \\"123\\" d d a"'), self.output)
        self.assertEqual('abc "123" d d a\n', self.output.getvalue())

    def test_back_quotes(self):
        self.target(BaseIO('` 1 + 2 * 3 `'), self.output)
        self.assertEqual('7\n', self.output.getvalue())

    def test_nested_back_quotes(self):
        self.target(BaseIO('` "`aiueo`" `'), self.output)
        self.assertEqual('`aiueo`\n', self.output.getvalue())
        self.output.truncate(0)
        self.output.seek(0)

        self.target(BaseIO('` \'`aiueo`\' `'), self.output)
        self.assertEqual('`aiueo`\n', self.output.getvalue())
class TestSyntax(unittest.TestCase):
    def setUp(self):
        self.target = generator
        self.output = BaseIO()

    def test_tab_split(self):
        self.target(BaseIO("1\t2\t3"), self.output)
        self.assertEqual("1\t2\t3\n", self.output.getvalue())

    def test_skip_comment(self):
        self.target(BaseIO("1 2 3 [2] # comment"), self.output)
        self.assertEqual("1 2 3 2\n", self.output.getvalue())
        self.output.truncate(0)
        self.output.seek(0)

        self.target(BaseIO(" # comment"), self.output)
        self.assertEqual("\n", self.output.getvalue())
        self.output.truncate(0)
        self.output.seek(0)

        self.target(BaseIO("# comment ## comment"), self.output)
        self.assertEqual("\n", self.output.getvalue())

    def test_python_statement(self):
        self.target(BaseIO("% A = 1"), self.output)
        self.assertEqual("", self.output.getvalue())
        self.output.truncate(0)
        self.output.seek(0)

        self.target(BaseIO("% x = 1\nx x"), self.output)
        self.assertEqual("1 1\n", self.output.getvalue())
        self.output.truncate(0)
        self.output.seek(0)

        self.target(BaseIO("% print(1)"), self.output)
        self.assertEqual("1\n", self.output.getvalue())
        self.output.truncate(0)
        self.output.seek(0)

        self.target(BaseIO("%"), self.output)
        self.assertEqual("", self.output.getvalue())