class TestShallowCompression(CompressionTestCaseMixin, unittest.TestCase):
    def setUp(self):
        self.comp = Compression(False)

    def test_parse_marker_data(self):
        self.assert_parse_market_data('abcdefg', Marker(4, 3),
                                      Element([Element('abcd', 1)], 3), 'efg')

    def test_parse_marker(self):
        self.assert_parse_marker('(3x51)abcd', Element([Element('abc', 1)],
                                                       51), 'd')

        self.assert_parse_marker('(0x51)', Element([Element('', 1)], 51), '')
        self.assert_parse_marker('(2x51)ab', Element([Element('ab', 1)], 51),
                                 '')

    def test_parse(self):
        text = 'abcd(8x15)(10x11)efg(3x3)hijklm'
        expected = Element([
            Element('abcd', 1),
            Element([Element('(10x11)e', 1)], 15),
            Element('fg', 1),
            Element([Element('hij', 1)], 3),
            Element('klm', 1)
        ],
                           repeat=1)
        self.assertEqual(self.comp.parse(text), expected)

    def test_decompress(self):
        self.assert_decompress('ADVENT', 'ADVENT')
        self.assert_decompress('A(1x5)BC', 'ABBBBBC')
        self.assert_decompress('(3x3)XYZ', 'XYZXYZXYZ')
        self.assert_decompress('A(2x2)BCD(2x2)EFG', 'ABCBCDEFEFG')
        self.assert_decompress('(6x1)(1x3)A', '(1x3)A')
        self.assert_decompress('X(8x2)(3x3)ABCY', 'X(3x3)ABC(3x3)ABCY')
class TestDeepCompression(CompressionTestCaseMixin, unittest.TestCase):
    def setUp(self):
        self.comp = Compression(True)

    def test_parse_marker_data(self):
        text = '(2x2)BCD(2x2)EFG'
        marker = Marker(len(text) - 1, 3)
        element = Element([
            Element([Element('BC', 1)], 2),
            Element('D', 1),
            Element([Element('EF', 1)], 2)
        ],
                          repeat=3)
        self.assert_parse_market_data(text, marker, element, 'G')

    def test_parse_marker(self):
        element = Element([Element('abc', 1)], 51)
        self.assert_parse_marker('(3x51)abcd', element, 'd')

        self.assert_parse_marker('(0x51)', Element([], 51), '')

        element = Element([Element('ab', 1)], 51)
        self.assert_parse_marker('(2x51)ab', element, '')

    def test_parse(self):
        text = 'abcd(7x15)(1x11)efg(3x3)hijklm'
        expected = Element([
            Element('abcd', 1),
            Element([Element([Element('e', 1)], 11)], 15),
            Element('fg', 1),
            Element([Element('hij', 1)], 3),
            Element('klm', 1)
        ],
                           repeat=1)
        self.assertEqual(self.comp.parse(text), expected)

    def test_decompress(self):
        self.assert_decompress('ADVENT', 'ADVENT')
        self.assert_decompress('A(1x5)BC', 'ABBBBBC')
        self.assert_decompress('(3x3)XYZ', 'XYZXYZXYZ')
        self.assert_decompress('A(2x2)BCD(2x2)EFG', 'ABCBCDEFEFG')
        self.assert_decompress('(6x1)(1x3)A', 'AAA')
        self.assert_decompress('X(8x2)(3x3)ABCY', 'XABCABCABCABCABCABCY')