/// <summary>
        /// Update a tournament's attributes.
        /// </summary>
        /// <returns></returns>
        public Tournament TournamentUpdate(Tournament tournament, TournamentUpdateParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException("parameters");
            }

            Dictionary<string, dynamic> param = parameters.ToDictionary();

            if (param.Count == 0)
            {
                throw new ArgumentException("You need to change some parameters in order to call update.", "parameters");
            }

            string url = string.Format("tournaments/{0}", this.TournamentIdentifier(tournament));
            var json = this.MakeJsonRequest(url, WebRequestMethods.Http.Put, param);
            return Deserializer.Tournament(json);
        }
 public void TournamentUpdateType()
 {
     var parameters = new TournamentUpdateParameters { Type = TournamentType.RoundRobin };
     var updatedTournament = this.target.TournamentUpdate(this.tournamentUnderTest, parameters);
     Assert.AreEqual(updatedTournament.TournamentType, TournamentType.RoundRobin);
 }
        public void TournamentUpdatePrivate()
        {
            var parameters = new TournamentUpdateParameters { Private = true };

            var updatedTournament = this.target.TournamentUpdate(this.tournamentUnderTest, parameters);

            Assert.IsTrue(updatedTournament.IsPrivate);
        }
        public void TournamentUpdateName()
        {
            var newName = "TommeTest!" + Utilities.RandomName();
            var parameters = new TournamentUpdateParameters { Name = newName };

            Thread.Sleep(1500); // Letting time pase, so the updated_at is sure to be different.

            var updatedTournament = this.target.TournamentUpdate(this.tournamentUnderTest, parameters);

            Assert.AreEqual(newName, updatedTournament.Name);
            Assert.IsTrue(updatedTournament.UpdatedAt > this.tournamentUnderTest.UpdatedAt);
        }
        public void UpdateEveryPropertyInATournament()
        {
            var name = "TournamentTest" + Utilities.RandomName();
            this.tournament = this.target.TournamentCreate(name, TournamentType.Swiss, name);

            Assert.AreEqual(String.Empty, this.tournament.Description);
            Assert.IsFalse(this.tournament.OpenSignup, "Default of open_signup is true");
            Assert.IsFalse(this.tournament.AcceptAttachments, "Default of accept_attachments is true");
            Assert.IsFalse(this.tournament.HideForum, "Default of hide_forum is true");
            Assert.IsFalse(this.tournament.ShowRounds, "Default of show_rounds is true");
            Assert.IsFalse(this.tournament.IsPrivate, "Default of isPrivate is true");
            Assert.IsTrue(this.tournament.NotifyUsersWhenMatchesOpen, "Default of notify_users_when_matches_open is true");
            Assert.IsTrue(this.tournament.NotifyUsersWhenTheTournamentEnds, "Default of notify_users_when_the_tournament_ends is true");
            Assert.IsFalse(this.tournament.SequentialPairings, "Default of sequential_pairings is true");
            Assert.IsNull(this.tournament.SignupCap, "Default of signup_cap is not null");
            Assert.IsFalse(this.tournament.HoldThirdPlaceMatch, "Default of hold_third_place_match is not false");
            Assert.AreEqual(1.0, this.tournament.PtsForMatchWin);
            Assert.AreEqual(0.5, this.tournament.PtsForMatchTie);
            Assert.AreEqual(0.0, this.tournament.PtsForGameWin);
            Assert.AreEqual(0.0, this.tournament.PtsForGameTie);
            Assert.AreEqual(1.0, this.tournament.PtsForBye);
            Assert.AreEqual(0, this.tournament.SwissRounds);
            Assert.IsNull(this.tournament.RankedBy);
            Assert.AreEqual(1.0, this.tournament.RrPtsForMatchWin);
            Assert.AreEqual(0.5, this.tournament.RrPtsForMatchTie);
            Assert.AreEqual(0.0, this.tournament.RrPtsForGameWin);
            Assert.AreEqual(0.0, this.tournament.RrPtsForGameTie);
            Assert.IsNull(this.tournament.StartAt, "Default of started_at is not null");
            Assert.IsTrue(this.tournament.CreatedAt.HasValue);
            Utilities.AssertDateTimeWithin(DateTime.Now, this.tournament.CreatedAt.Value, new TimeSpan(0, 1, 0));
            Assert.IsNull(this.tournament.CheckInDuration);

            // Properties unchanged but still checked.
            Assert.IsTrue(this.tournament.CreatedByApi);
            Assert.IsTrue(this.tournament.AllowParticipantMatchReporting);
            Assert.IsNull(this.tournament.Category);
            Assert.IsNull(this.tournament.CompletedAt);
            Assert.IsFalse(this.tournament.CreditCapped);
            Assert.IsNull(this.tournament.GameId);
            Assert.IsFalse(this.tournament.EnableGroupStage);
            Assert.IsFalse(this.tournament.HideSeeds);
            Assert.AreEqual(1, this.tournament.MaxPredictionsPerUser);
            Assert.AreEqual(0, this.tournament.ParticipantsCount);
            Assert.AreEqual(0, this.tournament.PredictionMethod);
            Assert.IsNull(this.tournament.PredictionsOpenedAt);
            Assert.AreEqual(0, this.tournament.ProgressMeter);
            Assert.IsFalse(this.tournament.QuickAdvance);
            Assert.IsFalse(this.tournament.RequireScoreAgreement);
            Assert.IsNull(this.tournament.StartedCheckingInAt);
            Assert.AreEqual(String.Empty, this.tournament.DescriptionSource);
            Assert.IsNull(this.tournament.Subdomain);
            Assert.AreEqual("http://challonge.com/" + name, this.tournament.FullChallongeUrl);
            Assert.AreEqual("http://images.challonge.com/" + name + ".png", this.tournament.LiveImageUrl);
            Assert.IsNull(this.tournament.SignUpUrl);
            Assert.IsTrue(this.tournament.ReviewBeforeFinalizing);
            Assert.IsFalse(this.tournament.AcceptingPredictions);
            Assert.IsFalse(this.tournament.ParticipantsLocked);
            Assert.IsNull(this.tournament.GameName);
            Assert.IsTrue(this.tournament.ParticipantsSwappable);
            Assert.IsFalse(this.tournament.TeamConvertable);
            Assert.IsFalse(this.tournament.GroupStagesWereStarted);

            // In order to test swiss_rounds we need some participants in the tournament.
            this.target.ParticipantCreate(this.tournament, new ParticipantCreateParameters { Name = Utilities.RandomName() });
            this.target.ParticipantCreate(this.tournament, new ParticipantCreateParameters { Name = Utilities.RandomName() });
            this.target.ParticipantCreate(this.tournament, new ParticipantCreateParameters { Name = Utilities.RandomName() });
            this.target.ParticipantCreate(this.tournament, new ParticipantCreateParameters { Name = Utilities.RandomName() });

            const string NewDescription = "My awesome Description";
            const int NewSignupCap = 16;
            int? newCheckInDuration = 10;
            DateTime newStartAt = DateTime.Now.AddHours(1.0);
            const double NewPtsForMatchWin = 2.0;
            const double NewPtsForMatchTie = 3.0;
            const double NewPtsForGameWin = 4.0;
            const double NewPtsForGameTie = 5.0;
            const double NewPtsForBye = 6.0;
            const int NewSwissRounds = 2;
            const double NewRrPtsForMatchWin = 7.0;
            const double NewRrPtsForMatchTie = 8.0;
            const double NewRrPtsForGameWin = 9.0;
            const double NewRrPtsForGameTie = 10.0;

            var updateParameters = new TournamentUpdateParameters
            {
                Description = NewDescription,
                OpenSignup = true,
                AcceptAttachments = true,
                HideForum = true,
                ShowRounds = true,
                Private = true,
                NotifyUsersWhenMatchesOpen = false,
                NotifyUsersWhenTheTournamentEnds = false,
                SequentialPairings = true,
                SignupCap = NewSignupCap,
                StartAt = newStartAt,
                CheckInDuration = newCheckInDuration,
                PtsForMatchWin = NewPtsForMatchWin,
                PtsForMatchTie = NewPtsForMatchTie,
                PtsForGameWin = NewPtsForGameWin,
                PtsForGameTie = NewPtsForGameTie,
                PtsForBye = NewPtsForBye,
                SwissRounds = NewSwissRounds,
                RrPtsForMatchWin = NewRrPtsForMatchWin,
                RrPtsForMatchTie = NewRrPtsForMatchTie,
                RrPtsForGameWin = NewRrPtsForGameWin,
                RrPtsForGameTie = NewRrPtsForGameTie,
                RankedBy = TournamentRankedBy.GameWins
            };

            var updatedTournament = this.target.TournamentUpdate(this.tournament, updateParameters);
            Assert.AreEqual(NewDescription, updatedTournament.Description);
            Assert.IsTrue(updatedTournament.OpenSignup);
            Assert.IsTrue(updatedTournament.AcceptAttachments);
            Assert.IsTrue(updatedTournament.HideForum);
            Assert.IsTrue(updatedTournament.ShowRounds);
            Assert.IsTrue(updatedTournament.IsPrivate);
            Assert.IsFalse(updatedTournament.NotifyUsersWhenMatchesOpen);
            Assert.IsFalse(updatedTournament.NotifyUsersWhenTheTournamentEnds);
            Assert.IsTrue(updatedTournament.SequentialPairings);
            Assert.AreEqual(NewSignupCap, updatedTournament.SignupCap);
            Assert.IsTrue(updatedTournament.StartAt.HasValue);
            Utilities.AssertDateTimeWithin(newStartAt, updatedTournament.StartAt.Value, new TimeSpan(hours: 0, minutes: 1, seconds: 0));
            Assert.AreEqual(newCheckInDuration, updatedTournament.CheckInDuration);

            Assert.AreEqual(NewPtsForMatchWin, updatedTournament.PtsForMatchWin);
            Assert.AreEqual(NewPtsForMatchTie, updatedTournament.PtsForMatchTie);
            Assert.AreEqual(NewPtsForGameWin, updatedTournament.PtsForGameWin);
            Assert.AreEqual(NewPtsForGameTie, updatedTournament.PtsForGameTie);
            Assert.AreEqual(NewPtsForBye, updatedTournament.PtsForBye);
            Assert.AreEqual(NewSwissRounds, updatedTournament.SwissRounds);
            Assert.AreEqual(TournamentRankedBy.GameWins, updatedTournament.RankedBy);
            Assert.AreEqual(NewRrPtsForMatchWin, updatedTournament.RrPtsForMatchWin);
            Assert.AreEqual(NewRrPtsForMatchTie, updatedTournament.RrPtsForMatchTie);
            Assert.AreEqual(NewRrPtsForGameWin, updatedTournament.RrPtsForGameWin);
            Assert.AreEqual(NewRrPtsForGameTie, updatedTournament.RrPtsForGameTie);
        }
        public void TournamentOperationsInSubdomainControlledByTournamentId()
        {
            var name = "TournamentTest" + Utilities.RandomName();

            var parameter = new TournamentCreateParameters { Subdomain = this.subdomain };
            this.tournament = this.target.TournamentCreate(name, TournamentType.DoubleElimination, name, parameter);

            const string NewDescription = "Just another description";
            var updateParameters = new TournamentUpdateParameters
            {
                Description = NewDescription
            };
            var updatedTournament = this.target.TournamentUpdate(new Tournament { Id = this.tournament.Id }, updateParameters);
            Assert.AreEqual(NewDescription, updatedTournament.Description);

            // In order to start a tournament do we need some participants.
            this.target.ParticipantCreate(new Tournament { Id = this.tournament.Id }, new ParticipantCreateParameters { Name = Utilities.RandomName() });
            this.target.ParticipantCreate(new Tournament { Id = this.tournament.Id }, new ParticipantCreateParameters { Name = Utilities.RandomName() });

            var startedTournament = this.target.TournamentStart(new Tournament { Id = this.tournament.Id });
            Assert.AreEqual(TournamentState.underway, startedTournament.Tournamentstate);
        }