# -*- coding: utf-8 -*-
import os
import sys
import subprocess
import tempfile
import pyqtgraph as pg
import pytest
import textwrap
import time

code = """
import sys
sys.path.insert(0, '{path}')
import pyqtgraph as pg
app = pg.mkQApp()
w = pg.{classname}({args})
"""

skipmessage = ('unclear why this test is failing. skipping until someone has'
               ' time to fix it')


def call_with_timeout(*args, **kwargs):
    """Mimic subprocess.call with timeout for python < 3.3"""
    wait_per_poll = 0.1
    try:
        timeout = kwargs.pop('timeout')
    except KeyError:
        timeout = 10

    rc = None
    p = subprocess.Popen(*args, **kwargs)
    for i in range(int(timeout/wait_per_poll)):
        rc = p.poll()
        if rc is not None:
            break
        time.sleep(wait_per_poll)
    return rc


@pytest.mark.skipif(True, reason=skipmessage)
def test_exit_crash():
    # For each Widget subclass, run a simple python script that creates an
    # instance and then shuts down. The intent is to check for segmentation
    # faults when each script exits.
    tmp = tempfile.mktemp(".py")
    path = os.path.dirname(pg.__file__)

    initArgs = {
        'CheckTable': "[]",
        'ProgressDialog': '"msg"',
        'VerticalLabel': '"msg"',
    }

    for name in dir(pg):
        obj = getattr(pg, name)
        if not isinstance(obj, type) or not issubclass(obj, pg.QtGui.QWidget):
            continue

        print(name)
        argstr = initArgs.get(name, "")
        with open(tmp, 'w') as f:
            f.write(code.format(path=path, classname=name, args=argstr))
        proc = subprocess.Popen([sys.executable, tmp])
        assert proc.wait() == 0

    os.remove(tmp)

@pytest.mark.skipif(pg.Qt.QtVersion.startswith("5.9"), reason="Functionality not well supported, failing only on this config")
def test_pg_exit():
    # test the pg.exit() function
    code = textwrap.dedent("""
        import pyqtgraph as pg
        app = pg.mkQApp()
        pg.plot()
        pg.exit()
    """)
    rc = call_with_timeout([sys.executable, '-c', code], timeout=5, shell=False)
    assert rc == 0
