import subprocess

from scripts.test import shared

from . import utils


class InitialFuzzTest(utils.BinaryenTestCase):
    def test_empty_initial(self):
        # generate fuzz from random data
        data = self.input_path('random_data.txt')
        a = shared.run_process(shared.WASM_OPT + ['-ttf', '--print', data],
                               stdout=subprocess.PIPE).stdout

        # generate fuzz from random data with initial empty wasm
        empty_wasm = self.input_path('empty.wasm')
        b = shared.run_process(
            shared.WASM_OPT + ['-ttf', '--print', data,
                               '--initial-fuzz=' + empty_wasm],
            stdout=subprocess.PIPE).stdout

        # an empty initial wasm causes no changes
        self.assertEqual(a, b)

    def test_small_initial(self):
        data = self.input_path('random_data.txt')
        hello_wat = self.input_path('hello_world.wat')
        out = shared.run_process(shared.WASM_OPT + ['-ttf', '--print', data,
                                 '--initial-fuzz=' + hello_wat],
                                 stdout=subprocess.PIPE).stdout

        # the function should be there (perhaps with modified contents - don't
        # check that)
        self.assertIn('(export "add" (func $add))', out)

        # there should be other fuzz contents added as well
        self.assertGreater(out.count('(export '), 1)
