import re
import os
import tempfile
import unittest
import warnings
import pickle
import sys

import nose.config
from nose.plugins.manager import DefaultPluginManager
from nose.plugins.skip import SkipTest
from nose.plugins.prof import Profile


class TestNoseConfig(unittest.TestCase):

    def test_defaults(self):
        c = nose.config.Config()
        assert c.addPaths == True
        # FIXME etc

    def test_reset(self):
        c = nose.config.Config()
        c.include = 'include'
        assert c.include == 'include'
        c.reset()
        assert c.include is None

    def test_update(self):
        c = nose.config.Config()
        c.update({'exclude':'x'})
        assert c.exclude == 'x'

    def test_ignore_files_default(self):
        """
        The default configuration should have several ignore file settings.
        """
        c = nose.config.Config()
        c.configure(['program'])
        self.assertEqual(len(c.ignoreFiles), 3)
    
    def test_ignore_files_single(self):
        """A single ignore-files flag should override the default settings.""" 
        c = nose.config.Config()
        c.configure(['program', '--ignore-files=a'])
        self.assertEqual(len(c.ignoreFiles), 1)
        aMatcher = c.ignoreFiles[0]
        assert aMatcher.match('a')
        assert not aMatcher.match('b')
    
    def test_ignore_files_multiple(self):
        """
        Multiple ignore-files flags should be appended together, overriding
        the default settings.
        """
        c = nose.config.Config()
        c.configure(['program', '--ignore-files=a', '-Ib'])
        self.assertEqual(len(c.ignoreFiles), 2)
        aMatcher, bMatcher = c.ignoreFiles
        assert aMatcher.match('a')
        assert not aMatcher.match('b')
        assert bMatcher.match('b')
        assert not bMatcher.match('a')
    
    def test_multiple_include(self):
        c = nose.config.Config()
        c.configure(['program', '--include=a', '--include=b'])
        self.assertEqual(len(c.include), 2)
        a, b = c.include
        assert a.match('a')
        assert not a.match('b')
        assert b.match('b')
        assert not b.match('a')

    def test_single_include(self):
        c = nose.config.Config()
        c.configure(['program', '--include=b'])
        self.assertEqual(len(c.include), 1)
        b = c.include[0]
        assert b.match('b')
        assert not b.match('a')

    def test_plugins(self):
        c = nose.config.Config()
        assert c.plugins
        c.plugins.begin()

    def test_testnames(self):
        c = nose.config.Config()
        c.configure(['program', 'foo', 'bar', 'baz.buz.biz'])
        self.assertEqual(c.testNames, ['foo', 'bar', 'baz.buz.biz'])

        c = nose.config.Config(testNames=['foo'])
        c.configure([])
        self.assertEqual(c.testNames, ['foo'])

    def test_where(self):
        # we don't need to see our own warnings
        warnings.filterwarnings(action='ignore',
                                category=DeprecationWarning,
                                module='nose.config')

        here = os.path.dirname(__file__)
        support = os.path.join(here, 'support')
        foo = os.path.abspath(os.path.join(support, 'foo'))
        c = nose.config.Config()
        c.configure(['program', '-w', foo, '-w', 'bar'])
        self.assertEqual(c.workingDir, foo)
        self.assertEqual(c.testNames, ['bar'])

    def test_progname_looks_like_option(self):
        # issue #184
        c = nose.config.Config()
        # the -v here is the program name, not an option
        # this matters eg. with python -c "import nose; nose.main()"
        c.configure(['-v', 'mytests'])
        self.assertEqual(c.verbosity, 1)

    def test_pickle_empty(self):
        c = nose.config.Config()
        cp = pickle.dumps(c)
        cc = pickle.loads(cp)

    def test_pickle_configured(self):
        if 'java' in sys.version.lower():
            raise SkipTest("jython has no profiler plugin")
        c = nose.config.Config(plugins=DefaultPluginManager())
        config_args = ['--with-doctest', '--with-coverage', 
                     '--with-id', '--attr=A', '--collect', '--all',
                     '--with-isolation', '-d', '--with-xunit', '--processes=2',
                     '--pdb']
        if Profile.available():
            config_args.append('--with-profile')
        c.configure(config_args)
        cp = pickle.dumps(c)
        cc = pickle.loads(cp)
        assert cc.plugins._plugins


if __name__ == '__main__':
    unittest.main()
