def testBreakElement(self, MockConversionDB):
        # Set up mock database
        db = conversion_db.ConversionDB()

        def mockCmdConversion(cmd):
            if cmd == 'a':
                return [BreakElement(time='3ms')]
            else:
                return None

        def mockEnvConversion(env):
            if env == 'b':
                return [
                    BreakElement(strength='strong'),
                    ContentElement(),
                    BreakElement(strength='weak')
                ]
            else:
                return None

        def mockEnvDefinition(env):
            if env == 'b':
                return {
                    'a': [BreakElement(time='5ms', strength='x-weak')],
                    'mathmode': False
                }
            else:
                return None

        db.getCmdConversion = Mock(side_effect=mockCmdConversion)
        db.getEnvConversion = Mock(side_effect=mockEnvConversion)
        db.getEnvDefinition = Mock(side_effect=mockEnvDefinition)

        # Set up TexSoup parse tree to be parsed
        doc = TexSoup.TexSoup(r'\a\begin{b}\a\end{b}')

        # Parse on the given db and tree
        parser = ConversionParser(db)
        ssmlParseTree = parser.parse(doc, test=True)

        # Check resulting tree structure
        self.assertIsInstance(ssmlParseTree, RootElement)
        self.assertEqual(len(ssmlParseTree.children), 4)

        self.assertIsInstance(ssmlParseTree.children[0], BreakElement)
        self.assertEqual(ssmlParseTree.children[0].getTime(), '3ms')
        self.assertEqual(ssmlParseTree.children[0].getStrength(), None)

        self.assertIsInstance(ssmlParseTree.children[1], BreakElement)
        self.assertEqual(ssmlParseTree.children[1].getTime(), None)
        self.assertEqual(ssmlParseTree.children[1].getStrength(), 'strong')

        self.assertIsInstance(ssmlParseTree.children[2], BreakElement)
        self.assertEqual(ssmlParseTree.children[2].getTime(), '5ms')
        self.assertEqual(ssmlParseTree.children[2].getStrength(), 'x-weak')

        self.assertIsInstance(ssmlParseTree.children[3], BreakElement)
        self.assertEqual(ssmlParseTree.children[3].getTime(), None)
        self.assertEqual(ssmlParseTree.children[3].getStrength(), 'weak')
    def testEnvironments(self, MockConversionDB):
        # Set up mock database
        db = conversion_db.ConversionDB()

        def mockCmdConversion(cmd):
            if cmd == 'a':
                a = [TextElement('text1')]
                return a
            else:
                return None

        def mockEnvConversion(env):
            if env == 'a':
                a = [TextElement('text2')]
                return a
            if env == 'b':
                b = [ContentElement()]
                return b
            else:
                return None

        def mockEnvDefinition(env):
            if env == 'b':
                return {'a': [TextElement('text3')], 'mathmode': False}
            else:
                return None

        db.getCmdConversion = Mock(side_effect=mockCmdConversion)
        db.getEnvConversion = Mock(side_effect=mockEnvConversion)
        db.getEnvDefinition = Mock(side_effect=mockEnvDefinition)

        # Set up TexSoup parse tree to be parsed
        doc = TexSoup.TexSoup(
            r'\begin{a}\a\end{a}\begin{c}\begin{a}\a\end{a}\end{c}\begin{c}\begin{b}\a\end{b}\end{c}'
        )

        # Parse on the given db and tree
        parser = ConversionParser(db)
        ssmlParseTree = parser.parse(doc, test=True)

        self.assertIsInstance(ssmlParseTree, RootElement)
        self.assertEqual(len(ssmlParseTree.children), 0)
        self.assertEqual(
            ssmlParseTree.getHeadText().strip().replace("  ", " "),
            'text2 text2 text3')
    def testTextElement(self, MockConversionDB):
        # Set up mock database
        db = conversion_db.ConversionDB()

        def mockCmdConversion(cmd):
            if cmd == 'a':
                return [TextElement('text 1')]
            else:
                return None

        def mockEnvConversion(env):
            if env == 'b':
                return [TextElement('text 2'), ContentElement()]
            else:
                return None

        def mockEnvDefinition(env):
            if env == 'b':
                return {'a': [TextElement('text 3')], 'type': None}
            else:
                return None

        db.getCmdConversion = Mock(side_effect=mockCmdConversion)
        db.getEnvConversion = Mock(side_effect=mockEnvConversion)
        db.getEnvDefinition = Mock(side_effect=mockEnvDefinition)

        # Set up TexSoup parse tree to be parsed
        doc = TexSoup.TexSoup(r'\a\begin{b}\a\end{b}')

        # Parse on the given db and tree
        parser = ConversionParser(db)
        ssmlParseTree = parser.parse(doc, test=True)
        print("TESTING SSSML PARSE " + str(ssmlParseTree))
        # Check resulting tree structure
        self.assertIsInstance(ssmlParseTree, RootElement)
        self.assertEqual(len(ssmlParseTree.children), 0)

        self.assertEqual(
            ssmlParseTree.getHeadText().strip().replace("  ", " "),
            'text 1 text 2 text 3')
    def testProsodyElementMaxDura(self, MockConversionDB):
        # Set up mock database
        db = conversion_db.ConversionDB()

        def mockCmdConversion(cmd):
            if cmd == 'a':
                a = [ProsodyElement(duration='2000s'), ArgElement(1)]
                a[0].insertChild(0, ProsodyElement(duration='1000s'))
                a[0].children[0].insertChild(0, ArgElement(2))
                return a
            else:
                return None

        def mockEnvConversion(env):
            if env == 'b':
                b = [
                    ContentElement(),
                    ProsodyElement(duration='3000ms'),
                    ArgElement(2),
                    ProsodyElement(duration='5000ms')
                ]
                b[1].insertChild(0, ContentElement())
                b[1].insertChild(0, ArgElement(1))
                b[3].insertChild(0, ProsodyElement(duration='9000s'))
                return b
            else:
                return None

        def mockEnvDefinition(env):
            return None

        db.getCmdConversion = Mock(side_effect=mockCmdConversion)
        db.getEnvConversion = Mock(side_effect=mockEnvConversion)
        db.getEnvDefinition = Mock(side_effect=mockEnvDefinition)

        # Set up TexSoup parse tree to be parsed
        doc = TexSoup.TexSoup(r'\a{1}{2}\begin{b}{3}{4}\a{5}{6}\end{b}')

        # Parse on the given db and tree
        parser = ConversionParser(db)
        ssmlParseTree = parser.parse(doc, test=True)

        self.assertIsInstance(ssmlParseTree, RootElement)
        self.assertEqual(len(ssmlParseTree.children), 4)

        self.assertIsInstance(ssmlParseTree.children[0], ProsodyElement)
        self.assertEqual(ssmlParseTree.children[0].getHeadText(), '')
        self.assertEqual(ssmlParseTree.children[0].getTailText(), '1')
        self.assertEqual(ssmlParseTree.children[0].getDuration(), '2000000ms')
        self.assertEqual(len(ssmlParseTree.children[0].children), 1)

        self.assertIsInstance(ssmlParseTree.children[0].children[0],
                              ProsodyElement)
        self.assertEqual(ssmlParseTree.children[0].children[0].getHeadText(),
                         '2')
        self.assertEqual(ssmlParseTree.children[0].children[0].getTailText(),
                         '')
        self.assertEqual(ssmlParseTree.children[0].children[0].getDuration(),
                         '1000000ms')

        self.assertIsInstance(ssmlParseTree.children[1], ProsodyElement)
        self.assertEqual(ssmlParseTree.children[1].getHeadText(), '')
        self.assertEqual(ssmlParseTree.children[1].getTailText(), '5')
        self.assertEqual(ssmlParseTree.children[1].getDuration(), '2000000ms')
        self.assertEqual(len(ssmlParseTree.children[1].children), 1)

        self.assertIsInstance(ssmlParseTree.children[1].children[0],
                              ProsodyElement)
        self.assertEqual(ssmlParseTree.children[1].children[0].getHeadText(),
                         '6')
        self.assertEqual(ssmlParseTree.children[1].children[0].getTailText(),
                         '')
        self.assertEqual(ssmlParseTree.children[1].children[0].getDuration(),
                         '1000000ms')

        self.assertIsInstance(ssmlParseTree.children[2], ProsodyElement)
        self.assertEqual(ssmlParseTree.children[2].getHeadText(), '3')
        self.assertEqual(ssmlParseTree.children[2].getTailText(), '4')
        self.assertEqual(ssmlParseTree.children[2].getDuration(), '3000ms')
        self.assertEqual(len(ssmlParseTree.children[2].children), 1)

        self.assertIsInstance(ssmlParseTree.children[2].children[0],
                              ProsodyElement)
        self.assertEqual(ssmlParseTree.children[2].children[0].getHeadText(),
                         '')
        self.assertEqual(ssmlParseTree.children[2].children[0].getTailText(),
                         '5')
        self.assertEqual(ssmlParseTree.children[2].children[0].getDuration(),
                         '2000000ms')
        self.assertEqual(len(ssmlParseTree.children[2].children), 1)

        self.assertIsInstance(
            ssmlParseTree.children[2].children[0].children[0], ProsodyElement)
        self.assertEqual(
            ssmlParseTree.children[2].children[0].children[0].getHeadText(),
            '6')
        self.assertEqual(
            ssmlParseTree.children[2].children[0].children[0].getTailText(),
            '')
        self.assertEqual(
            ssmlParseTree.children[2].children[0].children[0].getDuration(),
            '1000000ms')

        self.assertIsInstance(ssmlParseTree.children[3], ProsodyElement)
        self.assertEqual(ssmlParseTree.children[3].getHeadText(), '')
        self.assertEqual(ssmlParseTree.children[3].getTailText(), '')
        self.assertEqual(ssmlParseTree.children[3].getDuration(), '5000ms')
        self.assertEqual(len(ssmlParseTree.children[3].children), 1)

        self.assertIsInstance(ssmlParseTree.children[3].children[0],
                              ProsodyElement)
        self.assertEqual(ssmlParseTree.children[3].children[0].getHeadText(),
                         '')
        self.assertEqual(ssmlParseTree.children[3].children[0].getTailText(),
                         '')
        self.assertEqual(ssmlParseTree.children[3].children[0].getDuration(),
                         '9000000ms')
    def testArgElement(self, MockConversionDB):
        # Set up mock database
        db = conversion_db.ConversionDB()

        def mockCmdConversion(cmd):
            if cmd == 'a':
                a = [ArgElement(2), ArgElement('1', argType='bracket')]
                return a
            elif cmd == 'd':
                d = [BreakElement()]
                return d
            else:
                return None

        def mockEnvConversion(env):
            if env == 'b':
                b = [
                    ArgElement(1, 'bracket'),
                    ArgElement(4, argType='brace'),
                    ContentElement()
                ]
                return b
            else:
                return None

        def mockEnvDefinition(env):
            if env == 'b':
                return {'a': [ArgElement(1), ArgElement('2', argType='bracket')], \
                        'c': [ArgElement(3)], 'mathmode': False}
            else:
                return None

        db.getCmdConversion = Mock(side_effect=mockCmdConversion)
        db.getEnvConversion = Mock(side_effect=mockEnvConversion)
        db.getEnvDefinition = Mock(side_effect=mockEnvDefinition)

        # Set up TexSoup parse tree to be parsed
        doc = TexSoup.TexSoup(
            r'\a{1}{\a{2}[3]{\d}}[\d]\begin{b}{4}{5}[6]{7}{\a[8]{9}{10}[\d]}\d\a[11]{12}[13]\d\c{14}{15}{\d 16}\d\end{b}'
        )
        # Should be <speak> <break/> 3 <break/> 6 9 <break/> <break/> 12 13 <break/> <break/> 16 <break/> <speak/>
        #                   ^ Cmd               ^ Env say    ^ Env contents

        parser = ConversionParser(db)
        ssmlParseTree = parser.parse(doc, test=True)

        self.assertIsInstance(ssmlParseTree, RootElement)
        self.assertEqual(ssmlParseTree.getHeadText(), '')
        self.assertEqual(len(ssmlParseTree.children), 7)

        self.assertIsInstance(ssmlParseTree.children[0], BreakElement)
        self.assertEqual(ssmlParseTree.children[0].getTailText(), '3')

        self.assertIsInstance(ssmlParseTree.children[1], BreakElement)
        self.assertEqual(ssmlParseTree.children[1].getTailText(), '6 9')

        self.assertIsInstance(ssmlParseTree.children[2], BreakElement)
        self.assertEqual(ssmlParseTree.children[2].getTailText(), '')

        self.assertIsInstance(ssmlParseTree.children[3], BreakElement)
        self.assertEqual(ssmlParseTree.children[3].getTailText(), '12 13')

        self.assertIsInstance(ssmlParseTree.children[4], BreakElement)
        self.assertEqual(ssmlParseTree.children[4].getTailText(), '')

        self.assertIsInstance(ssmlParseTree.children[5], BreakElement)
        self.assertEqual(ssmlParseTree.children[5].getTailText(), ' 16')

        self.assertIsInstance(ssmlParseTree.children[6], BreakElement)
        self.assertEqual(ssmlParseTree.children[6].getTailText(), '')
    def testEmphasisElement(self, MockConversionDB):
        # Set up mock database
        db = conversion_db.ConversionDB()

        def mockCmdConversion(cmd):
            if cmd == 'a':
                a = [EmphasisElement(level='strong'), ArgElement(1)]
                a[0].insertChild(0, EmphasisElement(level='reduced'))
                a[0].children[0].insertChild(0, ArgElement(2))
                return a
            else:
                return None

        def mockEnvConversion(env):
            if env == 'b':
                b = [
                    ContentElement(),
                    EmphasisElement(level='moderate'),
                    ArgElement(2),
                    EmphasisElement(level='none')
                ]
                b[1].insertChild(0, ContentElement())
                b[1].insertChild(0, ArgElement(1))
                b[3].insertChild(0, EmphasisElement(level='strong'))
                return b
            else:
                return None

        def mockEnvDefinition(env):
            return None

        db.getCmdConversion = Mock(side_effect=mockCmdConversion)
        db.getEnvConversion = Mock(side_effect=mockEnvConversion)
        db.getEnvDefinition = Mock(side_effect=mockEnvDefinition)

        # Set up TexSoup parse tree to be parsed
        doc = TexSoup.TexSoup(r'\a{1}{2}\begin{b}{3}{4}\a{5}{6}\end{b}')

        # Parse on the given db and tree
        parser = ConversionParser(db)
        ssmlParseTree = parser.parse(doc, test=True)

        self.assertIsInstance(ssmlParseTree, RootElement)
        self.assertEqual(len(ssmlParseTree.children), 4)

        self.assertIsInstance(ssmlParseTree.children[0], EmphasisElement)
        self.assertEqual(ssmlParseTree.children[0].getHeadText(), '')
        self.assertEqual(ssmlParseTree.children[0].getTailText(), '1')
        self.assertEqual(ssmlParseTree.children[0].getLevel(), 'strong')
        self.assertEqual(len(ssmlParseTree.children[0].children), 1)

        self.assertIsInstance(ssmlParseTree.children[0].children[0],
                              EmphasisElement)
        self.assertEqual(ssmlParseTree.children[0].children[0].getHeadText(),
                         '2')
        self.assertEqual(ssmlParseTree.children[0].children[0].getTailText(),
                         '')
        self.assertEqual(ssmlParseTree.children[0].children[0].getLevel(),
                         'reduced')

        self.assertIsInstance(ssmlParseTree.children[1], EmphasisElement)
        self.assertEqual(ssmlParseTree.children[1].getHeadText(), '')
        self.assertEqual(ssmlParseTree.children[1].getTailText(), '5')
        self.assertEqual(ssmlParseTree.children[1].getLevel(), 'strong')
        self.assertEqual(len(ssmlParseTree.children[1].children), 1)

        self.assertIsInstance(ssmlParseTree.children[1].children[0],
                              EmphasisElement)
        self.assertEqual(ssmlParseTree.children[1].children[0].getHeadText(),
                         '6')
        self.assertEqual(ssmlParseTree.children[1].children[0].getTailText(),
                         '')
        self.assertEqual(ssmlParseTree.children[1].children[0].getLevel(),
                         'reduced')

        self.assertIsInstance(ssmlParseTree.children[2], EmphasisElement)
        self.assertEqual(ssmlParseTree.children[2].getHeadText(), '3')
        self.assertEqual(ssmlParseTree.children[2].getTailText(), '4')
        self.assertEqual(ssmlParseTree.children[2].getLevel(), 'moderate')
        self.assertEqual(len(ssmlParseTree.children[2].children), 1)

        self.assertIsInstance(ssmlParseTree.children[2].children[0],
                              EmphasisElement)
        self.assertEqual(ssmlParseTree.children[2].children[0].getHeadText(),
                         '')
        self.assertEqual(ssmlParseTree.children[2].children[0].getTailText(),
                         '5')
        self.assertEqual(ssmlParseTree.children[2].children[0].getLevel(),
                         'strong')
        self.assertEqual(len(ssmlParseTree.children[2].children), 1)

        self.assertIsInstance(
            ssmlParseTree.children[2].children[0].children[0], EmphasisElement)
        self.assertEqual(
            ssmlParseTree.children[2].children[0].children[0].getHeadText(),
            '6')
        self.assertEqual(
            ssmlParseTree.children[2].children[0].children[0].getTailText(),
            '')
        self.assertEqual(
            ssmlParseTree.children[2].children[0].children[0].getLevel(),
            'reduced')

        self.assertIsInstance(ssmlParseTree.children[3], EmphasisElement)
        self.assertEqual(ssmlParseTree.children[3].getHeadText(), '')
        self.assertEqual(ssmlParseTree.children[3].getTailText(), '')
        self.assertEqual(ssmlParseTree.children[3].getLevel(), 'none')
        self.assertEqual(len(ssmlParseTree.children[3].children), 1)

        self.assertIsInstance(ssmlParseTree.children[3].children[0],
                              EmphasisElement)
        self.assertEqual(ssmlParseTree.children[3].children[0].getHeadText(),
                         '')
        self.assertEqual(ssmlParseTree.children[3].children[0].getTailText(),
                         '')
        self.assertEqual(ssmlParseTree.children[3].children[0].getLevel(),
                         'strong')
 def testProsodyElementMaxDura(self, MockConversionDB):
     # Set up mock database
     db = conversion_db.ConversionDB()