//Method related to announcing changes regarding ballot-statuses.
        #region Ballots
        /// <summary>
        /// Announce to all that they should revoke this update!
        /// </summary>
        /// <param name="voterNumber">The voternumber to revoke a ballot for.</param>
        /// <param name="cpr">The CPR number to revoke a ballot for.</param>
        public void AnnounceRevokeBallot(VoterNumber voterNumber, CPR cpr)
        {
            Contract.Requires(IsManager);
            Contract.Requires(Database[voterNumber, cpr] == BallotStatus.Received);
            var cmd = new RevokeBallotCommand(Address, voterNumber, cpr);

            Peers.Keys.ForEach(peer => Communicator.Send(cmd, peer));
            cmd.Execute(this);
            if (Logger != null)
            {
                Logger.Log("Announcing that this ballot should be revoked: voternumber=" + voterNumber + "; CPR=" + cpr, Level.Warn);
            }
        }
        public void BallotReceivedCommandAndRevokeBallotCommandTest()
        {
            var vn  = new VoterNumber(250000);
            var cpr = new CPR(2312881234);

            Assert.That(Station.Database[vn, cpr] == BallotStatus.Unavailable);

            Station.Database.Import(new List <EncryptedVoterData> {
                new EncryptedVoterData(new CipherText(Station.Crypto.AsymmetricEncrypt(Bytes.From(vn.Value), Station.Crypto.VoterDataEncryptionKey)), new CipherText(Station.Crypto.AsymmetricEncrypt(Bytes.From(cpr.Value), Station.Crypto.VoterDataEncryptionKey)), new CipherText(Station.Crypto.AsymmetricEncrypt(Bytes.From(cpr.Value + (uint)BallotStatus.NotReceived), Station.Crypto.VoterDataEncryptionKey)))
            });

            var cmd = new BallotReceivedCommand(Manager.Address, Station.Address, vn, cpr);

            Assert.That(cmd.Sender == Manager.Address);
            Assert.That(Station.Database[vn, cpr] == BallotStatus.NotReceived);
            cmd.Execute(Station);
            Assert.That(Station.Database[vn, cpr] == BallotStatus.Received);

            var revoke = new RevokeBallotCommand(Manager.Address, vn, cpr);

            revoke.Execute(Station);
            Assert.That(Station.Database[vn, cpr] == BallotStatus.NotReceived);
        }
        public void ManagerRequirementCheckTest()
        {
            var start = new StartElectionCommand(NewPeer.Address);
            var end   = new EndElectionCommand(NewPeer.Address);

            Assert.That(!((TestUi)Station.UI).OngoingElection);
            start.Execute(Station);
            Assert.That(!((TestUi)Station.UI).OngoingElection);
            Station.StartElection();
            Assert.That(Station.ElectionInProgress);
            end.Execute(Station);
            Assert.That(Station.ElectionInProgress);

            var vn            = new VoterNumber(5);
            var cpr           = new CPR(5);
            var req           = new RequestBallotCommand(NewPeer.Address, vn, cpr);
            var reqCPROnly    = new RequestBallotCPROnlyCommand(NewPeer.Address, cpr, "sup homey");
            var revoke        = new RevokeBallotCommand(NewPeer.Address, vn, cpr);
            var revokeCPROnly = new RevokeBallotCPROnlyCommand(NewPeer.Address, cpr, "sup homey");

            req.Execute(Station);
            reqCPROnly.Execute(Station);
            revoke.Execute(Station);
            revokeCPROnly.Execute(Station);
            Assert.That(Station.Database[vn, cpr] == BallotStatus.Unavailable);

            NewPeer.Crypto.VoterDataEncryptionKey = Manager.Crypto.VoterDataEncryptionKey;
            var sync = new SyncCommand(NewPeer);

            sync.Execute(Station);

            var promoteManager = new PromoteNewManagerCommand(NewPeer.Address, NewPeer.Address);

            promoteManager.Execute(Station);
            Assert.That(!Station.Manager.Equals(NewPeer.Address));
        }