import os

from scripts.test import shared
from . import utils

"""Test that MemoryPacking correctly respects the web limitations by not
generating more than 100K data segments"""


class MemoryPackingTest(utils.BinaryenTestCase):
    def test_large_segment(self):
        data = '"' + (('A' + ('\\00' * 9)) * 100001) + '"'
        module = '''
        (module
         (memory 256 256)
         (data $d (i32.const 0) %s)
        )
        ''' % data
        opts = ['--memory-packing', '--disable-bulk-memory', '--print',
                '-o', os.devnull]
        p = shared.run_process(shared.WASM_OPT + opts, input=module,
                               check=False, capture_output=True)
        output = [
            '(data $d (i32.const 0) "A")',
            '(data $d.1 (i32.const 10) "A")',
            '(data $d.99998 (i32.const 999980) "A")',
            '(data $d.99999 (i32.const 999990) "A' + ('\\00' * 9) + 'A")'
        ]
        self.assertEqual(p.returncode, 0)
        for line in output:
            self.assertIn(line, p.stdout)

    def test_large_segment_unmergeable(self):
        data = '\n'.join('(data (i32.const %i) "A")' % i for i in range(100001))
        module = '(module (memory 256 256) %s)' % data
        opts = ['--memory-packing', '--enable-bulk-memory', '--print',
                '-o', os.devnull]
        p = shared.run_process(shared.WASM_OPT + opts, input=module,
                               check=False, capture_output=True)
        self.assertEqual(p.returncode, 0)
        self.assertIn('Some VMs may not accept this binary', p.stderr)
        self.assertIn('Run the limit-segments pass to merge segments.', p.stderr)
