def setUp(self):
        self.scf = StatCollectorFactory()

        self.mock_stat_factory = MockStatFactory()
        self.scf.set_stat_factory(self.mock_stat_factory)

        self.mock_repo_factory = MockRepositoryFactory()
        self.scf.set_repo_factory(self.mock_repo_factory)

        self.mock_results_stat_collector_factory = MockResultsStatCollectorFactory(None)
        self.scf.set_results_stat_collector_factory(self.mock_results_stat_collector_factory)

        self.mock_file_package_factory = MockFilePackageFactory()
        self.scf.set_file_package_factory(self.mock_file_package_factory)

        self.mock_file_iterator_factory = MockFileIteratorFactory()
        self.scf.set_file_iterator_factory(self.mock_file_iterator_factory)
class StatCollectorFactoryTests(TestCase):
    def setUp(self):
        self.scf = StatCollectorFactory()

        self.mock_stat_factory = MockStatFactory()
        self.scf.set_stat_factory(self.mock_stat_factory)

        self.mock_repo_factory = MockRepositoryFactory()
        self.scf.set_repo_factory(self.mock_repo_factory)

        self.mock_results_stat_collector_factory = MockResultsStatCollectorFactory(None)
        self.scf.set_results_stat_collector_factory(self.mock_results_stat_collector_factory)

        self.mock_file_package_factory = MockFilePackageFactory()
        self.scf.set_file_package_factory(self.mock_file_package_factory)

        self.mock_file_iterator_factory = MockFileIteratorFactory()
        self.scf.set_file_iterator_factory(self.mock_file_iterator_factory)

    def test_stat_collector_factory_raises_exception_for_invalid_config_with_msg(self):
        didthrow = False
        try:
            self.scf.get_stat_collector({})
        except StatConfigurationInvalidException as e:
            didthrow = True
            ok_(str(e).startswith("Unable to find required configuration option"))
        ok_(didthrow)

    def test_stat_collector_factory_creates_proper_stat(self):
        statname = "my_favorite_stat"
        conf = { "statname": statname }
        stat = self.scf.create_stat_from_config(conf)
        eq_(statname, self.mock_stat_factory.get_last_stat_created())
        eq_(conf, self.mock_stat_factory.get_last_config_passed())

    def test_stat_collector_factory_creates_proper_repo(self):
        directory = "/home/mdrago/repository_lives_here"
        conf = { "repodir": directory }
        repo = self.scf.create_repo_from_config(conf)
        eq_(directory, self.mock_repo_factory.get_last_directory())

    def test_stat_collector_factory_creates_file_package(self):
        basedir = "/home/mdrago/repository_lives_here"
        subdir = "TestProject"
        conf = {}
        conf["repodir"] = basedir
        conf["dirs"] = [ subdir ]
        fp = self.scf.create_file_package_from_config(conf)
        eq_(subdir, self.mock_file_package_factory.get_file_package().dirs[0])

    @raises(Exception)
    def test_stat_collector_factory_raises_exception_with_dirs_as_string(self):
        "the dirs setting has to be a list and not a string"
        basedir = "/home/mdrago/repository_lives_here"
        conf = {}
        conf["repodir"] = basedir
        conf["dirs"] = "a_string"
        self.scf.create_file_package_from_config(conf)

    def test_stat_collector_factory_creates_file_package_with_subdirs(self):
        basedir = "/home/mdrago/repository_lives_here"
        conf = {}
        conf["repodir"] = basedir
        conf["dirs"] = ['*']
        fp = self.scf.create_file_package_from_config(conf)
        eq_("*", self.mock_file_package_factory.get_file_package().dirs[0])

    def test_stat_collector_factory_creates_file_package_with_subdirs_when_dirs_omitted(self):
        basedir = "/home/mdrago/repository_lives_here"
        conf = {}
        conf["repodir"] = basedir
        fp = self.scf.create_file_package_from_config(conf)
        ok_(self.mock_file_package_factory.get_file_package().dirs[0])

    def test_stat_collector_factory_creates_file_package_with_excluded_dirs(self):
        basedir = "/home/mdrago/repository_lives_here"
        conf = {}
        conf["repodir"] = basedir
        conf["exclude_dirs"] = ["dir1", "dir2"]
        fp = self.scf.create_file_package_from_config(conf)
        expected = set(("dir1", "dir2"))
        actual = set(self.mock_file_package_factory.get_file_package().excluded_dirs)
        eq_(expected, actual)

    def test_stat_collector_factory_creates_file_iterator(self):
        basedir = "/home/mdrago/repository_lives_here"
        subdir = "TestProject"
        conf = {}
        conf["repodir"] = basedir
        conf["dirs"] = [ subdir ]
        fi = self.scf.create_file_iterator_from_config(conf)
        eq_(1, len(fi.get_filepackages()))

    def test_stat_collector_factory_creates_file_iterator_with_excluded_path_globs(self):
        basedir = "/home/mdrago/repository_lives_here"
        conf = {}
        conf["repodir"] = basedir
        conf["exclude_path_globs"] = ["*/test/*"]
        fp = self.scf.create_file_iterator_from_config(conf)
        actual = set(self.mock_file_iterator_factory.get_file_iterator().excluded_path_globs)
        eq_(set(["*/test/*"]), actual)

    def test_stat_collector_factory_creates_matcher_glob(self):
        self.scf.set_file_package_factory(FilePackageFactory)
        glob = "*.java"
        basedir = "/home/mdrago/repository_lives_here"
        subdir = "TestProject"
        conf = {}
        conf["glob"] = glob
        conf["repodir"] = basedir
        conf["dirs"] = [ subdir ]
        fp = self.scf.create_file_package_from_config(conf)
        eq_(1, len(fp.file_matchers))
        eq_(glob, fp.file_matchers[0].get_globs()[0])

    def test_stat_collector_factory_creates_start_time(self):
        current = datetime(2011, 5, 26, 7, 15, 0)
        self.scf.set_current_time(current)
        conf = {"start_time_delta": 7776000}
        start_time = self.scf.get_start_time_from_config(conf)
        eq_(datetime(2011, 2, 25, 7, 15, 0), start_time)

    def test_stat_collector_factory_creates_sample_time_interval(self):
        seconds = 2592000
        conf = {'sample_time_interval': seconds}
        expected = timedelta(seconds = seconds)
        actual = self.scf.get_sample_time_interval_from_config(conf)
        eq_(expected, actual)

    def test_stat_collector_factory_creates_results_stat_collector(self):
        conf = {'stattype': 'results', 'statname': 'mystat',
                'results_files': ['file1']}
        sc = self.scf.get_stat_collector(conf)
        eq_(MockResultsStatCollector, type(sc))

    def test_stat_collector_injects_results_file_names_in_to_collector(self):
        conf = {'stattype': 'results', 'statname': 'mystat',
                'results_files': ['file1', 'file2']}
        sc = self.scf.get_stat_collector(conf)
        rsc = self.mock_results_stat_collector_factory.get_results_stat_collector(None)
        eq_(['file1', 'file2'], rsc.files)