import sys
import nose.tools as nt

from subprocess import Popen, PIPE

def get_output_error_code(cmd):
    """Get stdout, stderr, and exit code from running a command"""
    p = Popen(cmd, stdout=PIPE, stderr=PIPE)
    out, err = p.communicate()
    out = out.decode('utf8', 'replace')
    err = err.decode('utf8', 'replace')
    return out, err, p.returncode


def check_help_output(pkg, subcommand=None):
    """test that `python -m PKG [subcommand] -h` works"""
    cmd = [sys.executable, '-m', pkg]
    if subcommand:
        cmd.extend(subcommand)
    cmd.append('-h')
    out, err, rc = get_output_error_code(cmd)
    nt.assert_equal(rc, 0, err)
    nt.assert_not_in("Traceback", err)
    nt.assert_in("Options", out)
    nt.assert_in("--help-all", out)
    return out, err


def check_help_all_output(pkg, subcommand=None):
    """test that `python -m PKG --help-all` works"""
    cmd = [sys.executable, '-m', pkg]
    if subcommand:
        cmd.extend(subcommand)
    cmd.append('--help-all')
    out, err, rc = get_output_error_code(cmd)
    nt.assert_equal(rc, 0, err)
    nt.assert_not_in("Traceback", err)
    nt.assert_in("Options", out)
    nt.assert_in("Class parameters", out)
    return out, err

add help output tests to traitlets.tests.utils