#!/usr/bin/env python3

# Automatically formatted with yapf (https://github.com/google/yapf)

import subprocess
import unittest


def getFinalPasses(run):
    stdout = run.stdout.decode()
    stdout = stdout[:stdout.rfind('\n')]
    stdout = stdout[stdout.rfind('\n') + 1:]
    return stdout


class Test(unittest.TestCase):
    def test_0(self):
        """Test all passes are removed except those required to crash. Verify
           that PM structure is intact."""
        run_args = [
            './utils/reduce_pipeline.py',
            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
            '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i',
            '-crash-seq=b,d,f'
        ]
        run = subprocess.run(run_args,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
        self.assertEqual(run.returncode, 0)
        self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B(f))"')

    def test_1(self):
        """Test all passes are removed except those required to crash. The
           required passes in this case are the first and last in that order
           (a bit of a corner-case for the reduction algorithm)."""
        run_args = [
            './utils/reduce_pipeline.py',
            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
            '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i',
            '-crash-seq=a,i'
        ]
        run = subprocess.run(run_args,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
        self.assertEqual(run.returncode, 0)
        self.assertEqual(getFinalPasses(run), '-passes="a,i"')

    def test_2_0(self):
        """Test expansion of EXPAND_a_to_f (expands into 'a,b,c,d,e,f')."""
        run_args = [
            './utils/reduce_pipeline.py',
            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
            '--input=/dev/null', '--passes=EXPAND_a_to_f', '-crash-seq=b,e'
        ]
        run = subprocess.run(run_args,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
        self.assertEqual(run.returncode, 0)
        self.assertEqual(getFinalPasses(run), '-passes="b,e"')

    def test_2_1(self):
        """Test EXPAND_a_to_f and the '--dont-expand-passes' option."""
        run_args = [
            './utils/reduce_pipeline.py',
            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
            '--input=/dev/null', '--passes=EXPAND_a_to_f',
            '-crash-seq=EXPAND_a_to_f', '--dont-expand-passes'
        ]
        run = subprocess.run(run_args,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
        self.assertEqual(run.returncode, 0)
        self.assertEqual(getFinalPasses(run), '-passes="EXPAND_a_to_f"')

    def test_3(self):
        """Test that empty pass-managers get removed by default."""
        run_args = [
            './utils/reduce_pipeline.py',
            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
            '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i',
            '-crash-seq=b,d,h'
        ]
        run = subprocess.run(run_args,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
        self.assertEqual(run.returncode, 0)
        self.assertEqual(getFinalPasses(run), '-passes="b,A(d),h"')

    def test_4(self):
        """Test the '--dont-remove-empty-pm' option."""
        run_args = [
            './utils/reduce_pipeline.py',
            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
            '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i',
            '-crash-seq=b,d,h', '--dont-remove-empty-pm'
        ]
        run = subprocess.run(run_args,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
        self.assertEqual(run.returncode, 0)
        self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B()),h"')


unittest.main()
exit(0)
