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 = f'''
        (module
         (memory 256 256)
         (data $d (i32.const 0) {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(f'(data (i32.const {i}) "A")' for i in range(100001))
        module = f'(module (memory 256 256) {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)
