def setUp(self):
     super(TestScoreEntered, self).setUp()
     self.injector.inject(self.tourn_1, num_players=5)
     tourn = Tournament(self.tourn_1)
     tourn.update({
         'rounds': 2,
         'missions': ['foo_mission_1', 'foo_mission_2']
     })
     tourn.make_draws()
class TournamentInProgress(AppSimulatingTest):

    def setUp(self):
        super(TournamentInProgress, self).setUp()

        self.name = 'test_in_progress'
        self.player_1 = 'p1'

        self.injector.inject(self.name, num_players=0)
        self.injector.add_player(self.name, self.player_1)
        self.tournament = Tournament(self.name)
        self.tournament.update({
            'rounds': 1,
            'missions': ['mission01'],
            'score_categories': [score_cat_args('cat', 100, True, 1, 1, False)]
        })

    def test_default_state(self):
        self.assertFalse(self.tournament.get_dao().in_progress)

    def test_no_categories(self):
        self.tournament.update({'score_categories': []})
        self.assertRaises(ValueError, self.tournament.set_in_progress)

    def test_no_entries(self):
        self.tournament.update({'rounds': 0})
        dao = self.tournament.get_dao()
        Reg.query.filter_by(tournament_id=dao.id).delete()
        TournamentEntry.query.filter_by(tournament_id=dao.name).delete()
        self.assertRaises(ValueError, self.tournament.set_in_progress)

    def test_no_missions(self):
        self.tournament.update({'rounds': 0})
        self.tournament.update({'rounds': 1})
        self.assertRaises(ValueError, self.tournament.set_in_progress)

    def test_no_rounds(self):
        self.tournament.update({'rounds': 0})
        self.assertRaises(ValueError, self.tournament.set_in_progress)

    def test_set_in_progress(self):
        self.tournament.set_in_progress()
        self.assertTrue(self.tournament.get_dao().in_progress)

    def test_non_finalised_only_actions(self):
        self.tournament.set_in_progress()

        args = score_cat_args('disallowed_cat', 100, True, 1, 1)
        self.assertRaises(ValueError, self.tournament.update,
                          {'score_categories': [args]})
        self.assertRaises(ValueError, self.tournament.update, {'rounds': 5})

        rego = Reg(self.player_1, self.name)
        rego.add_to_db()
        self.assertRaises(ValueError, self.tournament.confirm_entries)
class TournamentMissionsTests(AppSimulatingTest):

    tourn_1 = 'test_missions'

    def setUp(self):
        super(TournamentMissionsTests, self).setUp()

        self.injector.inject(self.tourn_1)
        self.tourn = Tournament(self.tourn_1)
        self.tourn.update({'rounds': 2})

    # pylint: disable=protected-access
    def test_add_missions(self):
        self.tourn.update({'missions': ['foo', 'bar']})

        self.assertRaises(ValueError, self.tourn._set_missions, [])
        self.assertRaises(ValueError, self.tourn.update, {'missions': []})
        self.assertRaises(ValueError, self.tourn._set_missions, ['1'])
        self.assertRaises(ValueError, self.tourn.update, {'missions': ['1']})
        self.assertRaises(ValueError, self.tourn._set_missions, ['1', '2', '3'])
        self.assertRaises(ValueError, self.tourn.update,
                          {'missions': ['1', '2', '3']})

    def test_get_missions(self):
        compare(self.tourn.get_missions(), ['TBA', 'TBA'])

        self.tourn.update({'missions': ['foo', 'bar']})
        compare(self.tourn.get_missions(), ['foo', 'bar'])

    def test_round_change(self):
        self.tourn.update({'rounds': 0})
        self.tourn.update({'rounds': 1})

        compare(self.tourn.get_round(1).get_dao().get_mission(), 'TBA')
    def test_get_round(self):
        """Test the round getter"""
        name = 'test_get_round'
        self.injector.inject(name)

        tourn = Tournament(name)
        tourn.update({'rounds': 2})

        self.assertTrue(tourn.get_round(1).get_dao().ordering == 1)
        self.assertTrue(tourn.get_round(2).get_dao().ordering == 2)

        self.assertRaises(ValueError, tourn.get_round, 3)
        self.assertRaises(ValueError, tourn.get_round, -1)
        self.assertRaises(ValueError, tourn.get_round, 'a')
        self.assertRaises(ValueError, tourn.get_round, 0)
    def test_tournament_round_deletion(self):
        """Check that the rounds get deleted when rounds are reduced"""
        name = 'test_tournament_round_deletion'
        self.injector.inject(name)

        tourn = Tournament(name)
        tourn.update({'rounds': 6})
        compare(
            len(TournamentRound.query.filter_by(tournament_name=name).all()),
            6)

        tourn.update({'rounds': 2})
        compare(
            len(TournamentRound.query.filter_by(tournament_name=name).all()),
            2)
    def test_get_missions(self):
        """get missions for the rounds"""
        name = 'test_get_missions'
        self.injector.inject(name)
        tourn = Tournament(name)
        tourn.update({
            'rounds': 3,
            'missions': ['mission_1', 'mission_2', 'mission_3']
        })


        tourn.update({'rounds': 4})
        compare(tourn.get_round(1).get_dao().mission, 'mission_1')
        compare(tourn.get_round(4).get_dao().mission, None)

        compare(Tournament(name).get_missions(),
                ['mission_1', 'mission_2', 'mission_3', 'TBA'])
    def setUp(self):
        super(EnterScore, self).setUp()
        self.injector.inject(self.tourn_1, num_players=5)
        tourn = Tournament(self.tourn_1)
        tourn.update({
            'rounds': 2,
            'missions': ['foo_mission_1', 'foo_mission_2']
        })
        self.injector.add_player(self.tourn_1, self.player)
        score_args = cat('per_tournament', 50, True, 0, 100)

        # per tournament category
        self.cat_1 = ScoreCategory(tournament_id=self.tourn_1, **score_args)
        self.db.session.add(self.cat_1)

        # per round category
        score_args['name'] = 'per_round'
        score_args['per_tournament'] = False
        self.category_2 = ScoreCategory(tournament_id=self.tourn_1,
                                        **score_args)
        self.db.session.add(self.category_2)
        self.db.session.commit()
class ScoreCategoryTests(AppSimulatingTest):

    tourn_1 = 'test_score_categories'

    def setUp(self):
        super(ScoreCategoryTests, self).setUp()

        self.injector.inject(self.tourn_1)
        self.db.session.flush()
        self.db.session.commit()

        # Some default categories
        self.cat_1 = cat('painting', 10, False, 1, 20)
        self.cat_2 = cat('cat_battle', 80, True, 1, 20)
        self.cat_3 = cat('cat_sports', 10, True, 1, 5)

        self.tournament = Tournament(self.tourn_1)

    def test_categories_created(self):
        # Enter a cat
        self.tournament.update({'score_categories': [self.cat_1]})
        c_1 = ScoreCategory.query.\
            filter_by(name=self.cat_1['name']).first()
        compare(c_1.percentage, self.cat_1['percentage'])
        compare(c_1.per_tournament, self.cat_1['per_tournament'])
        compare(c_1.min_val, self.cat_1['min_val'])
        compare(c_1.max_val, self.cat_1['max_val'])

        # Enter multiple cats
        self.tournament.update({'score_categories': [self.cat_2, self.cat_3]})
        c_2 = ScoreCategory.query.\
            filter_by(name=self.cat_2['name']).first()
        compare(c_2.percentage, self.cat_2['percentage'])
        compare(c_2.per_tournament, self.cat_2['per_tournament'])
        compare(c_2.min_val, self.cat_2['min_val'])
        compare(c_2.max_val, self.cat_2['max_val'])

        c_3 = ScoreCategory.query.\
            filter_by(name=self.cat_3['name']).first()
        compare(c_3.percentage, self.cat_3['percentage'])
        compare(c_3.per_tournament, self.cat_3['per_tournament'])
        compare(c_3.min_val, self.cat_3['min_val'])
        compare(c_3.max_val, self.cat_3['max_val'])

    def test_old_categories_deleted(self):
        self.tournament.update({'score_categories': [self.cat_1]})
        self.tournament.update({'score_categories': [self.cat_2, self.cat_3]})

        # Double check cat 1 is deleted.
        compare(0, ScoreCategory.query.filter_by(name=self.cat_1['name']).\
            count())


    # pylint: disable=unused-variable
    def test_broken_min_max(self):
        neg_min = cat('painting', 10, False, -1, 20)
        neg_max = cat('painting', 10, False, 1, -1)
        zero_max = cat('painting', 10, False, 0, 0)
        min_high = cat('painting', 10, False, 10, 9)
        zero_min = cat('painting', 10, False, 0, 20)
        equal = cat('painting', 10, False, 1, 1)
        no_min = cat('painting', '10', False, '', 20)
        no_max = cat('painting', '10', False, 1, '')
        none_min = cat('painting', '1', False, None, 1)
        none_max = cat('painting', '1', False, 1, None)
        char_min = cat('painting', '1', False, 'a', 1)
        char_max = cat('painting', '1', False, 1, 'a')

        func = self.tournament.update
        self.assertRaises(ValueError, func, {'score_categories': [neg_min]})
        self.assertRaises(ValueError, func, {'score_categories': [neg_max]})
        self.assertRaises(ValueError, func, {'score_categories': [zero_max]})
        self.assertRaises(ValueError, func, {'score_categories': [min_high]})
        self.assertRaises(ValueError, func, {'score_categories': [no_min]})
        self.assertRaises(ValueError, func, {'score_categories': [no_max]})
        self.assertRaises(ValueError, func, {'score_categories': [none_min]})
        self.assertRaises(ValueError, func, {'score_categories': [none_max]})
        self.assertRaises(ValueError, func, {'score_categories': [char_min]})
        self.assertRaises(ValueError, func, {'score_categories': [char_max]})


    def test_broken_categories(self):
        # cat should perform input validation only
        fifty_one = cat('painting', 51, False, 1, 20)
        neg_pct = cat('painting', -1, False, 1, 20)
        zero_pct = cat('painting', 0, False, 1, 20)
        lge_pct = cat('painting', 101, False, 1, 20)
        char_pct = cat('painting', 'a', False, 1, 20)
        no_name = cat('', 10, False, 1, 20)
        none_name = cat(None, 10, False, 1, 20)

        func = self.tournament.update
        self.assertRaises(ValueError, func, {'score_categories': [neg_pct]})
        self.assertRaises(ValueError, func, {'score_categories': [zero_pct]})
        self.assertRaises(ValueError, func, {'score_categories': [lge_pct]})
        self.assertRaises(ValueError, func, {'score_categories': [char_pct]})
        self.assertRaises(ValueError, func, {'score_categories': [no_name]})
        self.assertRaises(ValueError, func, {'score_categories': [none_name]})
        self.assertRaises(ValueError, func,
                          {'score_categories': [fifty_one, fifty_one]})