Beispiel #1
0
        /// <summary>
        /// Order by:
        /// 0 - Announcement order. (Default)
        /// 1 - Obtained votes ascending.
        /// 2 - Obtained votes descending.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override TicketsDictionary GetPageableElectionInfo(PageableElectionInfoInput input)
        {
            var startIndex = input.Start;
            var length     = input.Length;
            var orderBy    = input.OrderBy;

            var publicKeys = State.CandidatesField.Value.PublicKeys;

            length = length == 0 ? publicKeys.Count : length;

            var dict = new Dictionary <string, Tickets>();
            var take = Math.Min(publicKeys.Count - startIndex, length);

            foreach (var publicKey in publicKeys.Skip(startIndex).Take(take))
            {
                var tickets = State.TicketsMap[publicKey.ToStringValue()];
                if (tickets != null)
                {
                    dict.Add(publicKey, tickets);
                }
            }

            if (orderBy == 0)
            {
                return new TicketsDictionary
                       {
                           Maps = { dict }
                       }
            }
            ;

            if (orderBy == 1)
            {
                return new TicketsDictionary
                       {
                           Maps =
                           {
                               dict.OrderBy(p => p.Value.ObtainedTickets).Skip(startIndex).Take(take)
                               .ToDictionary(p => p.Key, p => p.Value)
                           }
                       }
            }
            ;

            if (orderBy == 2)
            {
                return new TicketsDictionary
                       {
                           Maps =
                           {
                               dict.OrderByDescending(p => p.Value.ObtainedTickets).Skip(startIndex).Take(take)
                               .ToDictionary(p => p.Key, p => p.Value)
                           }
                       }
            }
            ;

            return(new TicketsDictionary());
        }
Beispiel #2
0
        public async Task GetPageableElectionInfo()
        {
            await PrepareConsensusWithCandidateEnvironment();

            var input = new PageableElectionInfoInput
            {
                Length  = 3,
                OrderBy = 0,
                Start   = 0
            };

            //OrderBy = 0 default
            {
                var bytes = await Starter.CallContractMethodAsync(Starter.GetConsensusContractAddress(),
                                                                  nameof(ConsensusContract.GetPageableElectionInfo), input);

                var electionsInfo = TicketsDictionary.Parser.ParseFrom(bytes);
                electionsInfo.Maps.Count.ShouldBe(MinersCount);
            }

            //OrderBy = 1  ascending
            {
                input.OrderBy = 1;

                var bytes = await Starter.CallContractMethodAsync(Starter.GetConsensusContractAddress(),
                                                                  nameof(ConsensusContract.GetPageableElectionInfo), input);

                var electionsInfo = TicketsDictionary.Parser.ParseFrom(bytes);
                electionsInfo.Maps.Count.ShouldBe(MinersCount);
                List <long> tickets = new List <long>();
                foreach (var electionInfo in electionsInfo.Maps.Values)
                {
                    tickets.Add(electionInfo.ObtainedTickets);
                }

                tickets[0].ShouldBeLessThanOrEqualTo(tickets[1]);
                tickets[1].ShouldBeLessThanOrEqualTo(tickets[2]);
            }

            //OrderBy = 2 descending
            {
                input.OrderBy = 2;

                var bytes = await Starter.CallContractMethodAsync(Starter.GetConsensusContractAddress(),
                                                                  nameof(ConsensusContract.GetPageableElectionInfo), input);

                var electionsInfo = TicketsDictionary.Parser.ParseFrom(bytes);
                electionsInfo.Maps.Count.ShouldBe(MinersCount);
                List <long> tickets = new List <long>();
                foreach (var electionInfo in electionsInfo.Maps.Values)
                {
                    tickets.Add(electionInfo.ObtainedTickets);
                }

                tickets[0].ShouldBeGreaterThanOrEqualTo(tickets[1]);
                tickets[1].ShouldBeGreaterThanOrEqualTo(tickets[2]);
            }
            //OrderBy = others
            {
                input.OrderBy = 10;

                var bytes = await Starter.CallContractMethodAsync(Starter.GetConsensusContractAddress(),
                                                                  nameof(ConsensusContract.GetPageableElectionInfo), input);

                var electionsInfo = TicketsDictionary.Parser.ParseFrom(bytes);
                electionsInfo.Maps.Count.ShouldBe(0);
            }
            //Page count test
            {
                input = new PageableElectionInfoInput
                {
                    Start   = 0,
                    Length  = 2,
                    OrderBy = 0
                };
                var bytes = await Starter.CallContractMethodAsync(Starter.GetConsensusContractAddress(),
                                                                  nameof(ConsensusContract.GetPageableElectionInfo), input);

                var electionsInfo = TicketsDictionary.Parser.ParseFrom(bytes);
                electionsInfo.Maps.Count.ShouldBe(2);
            }
            //Page index test
            {
                input = new PageableElectionInfoInput
                {
                    Start   = 2,
                    Length  = 3,
                    OrderBy = 0
                };
                var bytes = await Starter.CallContractMethodAsync(Starter.GetConsensusContractAddress(),
                                                                  nameof(ConsensusContract.GetPageableElectionInfo), input);

                var electionsInfo = TicketsDictionary.Parser.ParseFrom(bytes);
                electionsInfo.Maps.Count.ShouldBe(1);
            }
        }