/// <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()); }
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); } }