/// <summary> /// Преобразование уровня/подуровня в суммарный уровень. /// </summary> /// <param name="perkScheme">Схема.</param> /// <param name="level">Уровень перка.</param> /// <param name="subLevel">Подуровень перка.</param> /// <returns></returns> public static int?ConvertLevel(IPerkScheme perkScheme, int?level, int subLevel) { if (perkScheme is null) { throw new ArgumentNullException(nameof(perkScheme)); } if (level == null) { return(null); } var sum = 0; for (var i = 0; i <= level; i++) { if (i < level) { sum += perkScheme.Levels[i].MaxValue + 1; } else { sum += subLevel; } } return(sum); }
/// <summary> /// Преобразование суммарного уровня в уровень/подуровень для конкретной схемы перка. /// </summary> /// <param name="perkScheme">Схема.</param> /// <param name="totalLevel">Суммарный уровень.</param> /// <param name="level">Уровень перка.</param> /// <param name="subLevel">Подуровень перка.</param> public static void ConvertTotalLevel(IPerkScheme perkScheme, int totalLevel, out int?level, out int?subLevel) { if (perkScheme is null) { throw new ArgumentNullException(nameof(perkScheme)); } var levelRemains = totalLevel; var currentLevelPointer = 0; do { if (currentLevelPointer >= perkScheme.Levels.Length) { level = null; subLevel = null; return; } var levelScheme = perkScheme.Levels[currentLevelPointer]; level = currentLevelPointer + 1; subLevel = Math.Min(levelRemains, levelScheme.MaxValue); currentLevelPointer++; var currentLevelCapability = levelScheme.MaxValue; levelRemains -= currentLevelCapability; } while (levelRemains >= 0); }
public void GetTest_OneBuildInPerk_ReturnsThisBuildInPerk() { var diceMock = new Mock <IDice>(); var dice = diceMock.Object; var schemeServiceMock = new Mock <ISchemeService>(); var perkSchemeList = new IPerkScheme[] { new TestPerkScheme { Sid = "test", IsBuildIn = true } }; schemeServiceMock.Setup(x => x.GetSchemes <IPerkScheme>()).Returns(perkSchemeList); var schemeService = schemeServiceMock.Object; var perkInitializator = new PersonPerkInitializator(dice, schemeService); // ACT var factPerks = perkInitializator.Generate(); // ASSERT factPerks.Should().HaveCount(1); factPerks[0].Scheme.Should().Be(perkSchemeList[0]); }
public static PerkLevel GetNextLevel(IPerkScheme perkScheme, PerkLevel level) { if (perkScheme is null) { throw new ArgumentNullException(nameof(perkScheme)); } if (level == null) { return(new PerkLevel(0, 0)); } var currentLevel = level.Primary; var currentSubLevel = level.Sub; var currentLevelScheme = perkScheme.Levels[currentLevel]; if (currentSubLevel + 1 > currentLevelScheme.MaxValue) { currentSubLevel = 0; currentLevel++; } else { currentSubLevel++; } return(new PerkLevel(currentLevel, currentSubLevel)); }
private static bool GetNextLevelToCheckNext(IPerkScheme perkScheme, PerkLevel level) { var currentTotal = ConvertLevelSubsToTotal(perkScheme, level.Primary, level.Sub); currentTotal++; return(TryConvertTotalLevelToLevelSubs(perkScheme, currentTotal, out var _)); }
public int ConvertLevelSubsToTotal_FromPositiveTestCases_ReturnsCorrectFact(IPerkScheme perkScheme, int primaryLevel, int subLevel) { // ACT var factTotal = PerkHelper.ConvertLevelSubsToTotal(perkScheme, primaryLevel, subLevel); // ASSERT return(factTotal); }
public void HasNextLevel_FromNegativeTestCases_AlwaysReturnsFalse(IPerkScheme perkScheme, PerkLevel currentLevel) { // ACT var factHasNextLevel = PerkHelper.HasNextLevel(perkScheme, currentLevel); // ASSERT factHasNextLevel.Should().BeFalse(); }
/// <summary> /// Преобразование суммарного уровня в уровень/подуровень для конкретной схемы перка. /// </summary> /// <param name="perkScheme">Схема.</param> /// <param name="totalLevel">Суммарный уровень.</param> public static bool TryConvertTotalLevelToLevelSubs(IPerkScheme perkScheme, int totalLevel, out PerkLevel?perkLevel) { if (perkScheme is null) { throw new ArgumentNullException(nameof(perkScheme)); } if (totalLevel == 0) { throw new ArgumentException("Total must be more that zero.", nameof(totalLevel)); } if (perkScheme.Levels is null) { throw new ArgumentException("Scheme's levels must not be null.", nameof(perkScheme)); } if (perkScheme.Levels.Length == 0) { throw new ArgumentException("Scheme's levels must notbe empty.", nameof(perkScheme)); } foreach (var schemeLevel in perkScheme.Levels) { if (schemeLevel?.MaxValue <= 0) { throw new ArgumentException("Scheme must contains no zeros.", nameof(perkScheme)); } } var schemeLevels = perkScheme.Levels.Select(x => x !.MaxValue).ToArray(); try { var isSuccess = TryConvertTotalIntoLevelSubsInner(schemeLevels, totalLevel, out var levelInner, out var subInner); perkLevel = null; if (isSuccess) { perkLevel = new PerkLevel(levelInner, subInner); } return(isSuccess); } catch (ArgumentException exception) { if (exception.ParamName == "total") { throw new ArgumentException($"Total {totalLevel} is too big", nameof(totalLevel), exception); } throw; } }
public void GetNextLevel_FromTestCases_ReturnsCorrectNextLevel(IPerkScheme perkScheme, PerkLevel currentLevel, PerkLevel expectedNextLevel) { // ACT var nextLevel = PerkHelper.GetNextLevel(perkScheme, currentLevel); // ASSERT nextLevel.Primary.Should().Be(expectedNextLevel.Primary); nextLevel.Sub.Should().Be(expectedNextLevel.Sub); }
public void ConvertLevelSubsToTotal_FromExceptionTestCases_ThrowsException(IPerkScheme perkScheme, int primaryLevel, int subLevel) { // ACT Action act = () => { PerkHelper.ConvertLevelSubsToTotal(perkScheme, primaryLevel, subLevel); }; act.Should().Throw <Exception>(); }
/// <summary> /// Преобразование уровня/подуровня в суммарный уровень. /// </summary> /// <param name="perkScheme">Схема.</param> /// <param name="level">Уровень перка.</param> /// <param name="subLevel">Подуровень перка.</param> /// <returns></returns> public static int ConvertLevelSubsToTotal(IPerkScheme perkScheme, int level, int subLevel) { if (perkScheme is null) { throw new ArgumentNullException(nameof(perkScheme)); } if (perkScheme.Levels?.Length < level) { throw new ArgumentException( $"Specified level: {level} is less that levels in scheme: {perkScheme.Levels?.Length}."); } var levels = perkScheme.Levels; if (levels is null) { throw new ArgumentException("The scheme's levels is null.", nameof(perkScheme)); } var sum = 0; for (var i = 1; i <= level; i++) { var perkLevelSubScheme = levels[i - 1]; if (perkLevelSubScheme is null) { throw new InvalidOperationException(); } if (i < level) { sum += perkLevelSubScheme.MaxValue; } else { if (perkLevelSubScheme.MaxValue < subLevel) { throw new ArgumentException( $"Specified sub: {subLevel} is less that sub in scheme: {perkLevelSubScheme.MaxValue}."); } sum += subLevel; } } return(sum); }
public static PerkLevel GetNextLevel(IPerkScheme perkScheme, PerkLevel level) { var currentTotal = ConvertLevelSubsToTotal(perkScheme, level.Primary, level.Sub); currentTotal++; if (!TryConvertTotalLevelToLevelSubs(perkScheme, currentTotal, out var nextLevel)) { throw new InvalidOperationException("Perk has no next level."); } if (nextLevel is null) { // The inner method garantee nextLevel is not null if convertion is successful. // So it is unknown error. throw new InvalidOperationException("Unknown exception."); } return(nextLevel); }
/// <summary> /// Преобразование уровня/подуровня в суммарный уровень. /// </summary> /// <param name="perkScheme">Схема.</param> /// <param name="level">Уровень перка.</param> /// <param name="subLevel">Подуровень перка.</param> /// <returns></returns> public static int?ConvertLevel(IPerkScheme perkScheme, int?level, int subLevel) { if (level == null) { return(null); } var sum = 0; for (var i = 0; i <= level; i++) { if (i < level) { sum += perkScheme.Levels[i].MaxValue + 1; } else { sum += subLevel; } } return(sum); }
public static PerkLevel GetNextLevel(IPerkScheme perkScheme, PerkLevel level) { if (level == null) { return(new PerkLevel(0, 0)); } var currentLevel = level.Primary; var currentSubLevel = level.Sub; var currentLevelScheme = perkScheme.Levels[currentLevel]; if (currentSubLevel + 1 > currentLevelScheme.MaxValue) { currentSubLevel = 0; currentLevel++; } else { currentSubLevel++; } return(new PerkLevel(currentLevel, currentSubLevel)); }
public Perk(IPerkScheme scheme) { Scheme = scheme ?? throw new ArgumentNullException(nameof(scheme)); }
public void ConvertTotalLevelToLevelSubs_FromTestCases_ReturnsCorrectLevelAndSublevel(IPerkScheme perkScheme, int testedTotalLevel, int expectedLevel, int expectedSubLevel) { // ACT var isSuccess = PerkHelper.TryConvertTotalLevelToLevelSubs(perkScheme, testedTotalLevel, out var perkLevel); // ASSERT isSuccess.Should().BeTrue(); perkLevel.Primary.Should().Be(expectedLevel); perkLevel.Sub.Should().Be(expectedSubLevel); }
public static bool HasNextLevel(IPerkScheme perkScheme, PerkLevel level) { return(GetNextLevelToCheckNext(perkScheme, level)); }