package gregtech.overclock; import static gregtech.api.enums.GT_Values.V; import static gregtech.api.enums.GT_Values.VP; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import gregtech.api.util.GT_OverclockCalculator; class GT_OverclockCalculator_UnitTest { private static final String messageDuration = "Duration Calculated Wrong"; private static final String messageEUt = "EUt Calculated Wrong"; @Test void fullPerfectOverclockEBF_Test() { int heatDiscounts = (1800 * 4) / 900; long correctConsumption = (long) Math.ceil(VP[5] * Math.pow(0.95, heatDiscounts)); GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[5]) .setDuration(1024).enableHeatOC().enableHeatDiscount().setRecipeHeat(1800).setMultiHeat(1800 * 5) .calculate(); assertEquals(1024 >> 8, calculator.getDuration(), messageDuration); assertEquals(correctConsumption, calculator.getConsumption(), messageEUt); } @Test void imperfectOverclockEBFWithOneHeatDiscount_Test() { int heatDiscounts = 1; long correctConsumption = (long) Math.ceil(VP[5] * Math.pow(0.95, heatDiscounts)); GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[5]) .setDuration(1024).enableHeatOC().enableHeatDiscount().setRecipeHeat(1800).setMultiHeat(2700) .calculate(); assertEquals(1024 >> 4, calculator.getDuration(), messageDuration); assertEquals(correctConsumption, calculator.getConsumption(), messageEUt); } @Test void imperfectOverclockEBFWithoutHeatDiscounts_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[5]) .setDuration(1024).enableHeatOC().enableHeatDiscount().setRecipeHeat(1800).setMultiHeat(1800) .calculate(); assertEquals(1024 >> 4, calculator.getDuration(), messageDuration); assertEquals(VP[5], calculator.getConsumption(), messageEUt); } @Test void perfectAndImperfectOverclockEBFWithTwoHeatDiscounts_Test() { int heatDiscounts = 2; long correctConsumption = (long) Math.ceil(VP[5] * Math.pow(0.95, heatDiscounts)); GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[5]) .setDuration(1024).enableHeatOC().enableHeatDiscount().setRecipeHeat(1800).setMultiHeat(3600) .calculate(); assertEquals(1024 >> 5, calculator.getDuration(), messageDuration); assertEquals(correctConsumption, calculator.getConsumption(), messageEUt); } @Test void generalImperfectOverclock_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setDuration(1024).calculate(); assertEquals(1024 >> 5, calculator.getDuration(), messageDuration); assertEquals(VP[6], calculator.getConsumption(), messageEUt); } @Test void generalPerfectOverclock_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setDuration(2048).enablePerfectOC().calculate(); assertEquals(2048 >> 10, calculator.getDuration(), messageDuration); assertEquals(VP[6], calculator.getConsumption(), messageEUt); } @Test void weirdHeatEBF_Test() { int heatDiscounts = 3; long correctConsumption = (long) Math.ceil(VP[6] * Math.pow(0.95, heatDiscounts)); GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setDuration(2048).enableHeatOC().enableHeatDiscount().setRecipeHeat(486).setMultiHeat(3900) .calculate(); assertEquals(2048 >> 6, calculator.getDuration(), messageDuration); assertEquals(correctConsumption, calculator.getConsumption(), messageEUt); } @Test void doubleEnergyHatchOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6] + V[6]) .setAmperage(2).setDuration(1024).calculate(); assertEquals(1024 >> 6, calculator.getDuration(), messageDuration); assertEquals(VP[7], calculator.getConsumption(), messageEUt); } @Test void multiAmpHatchOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setAmperage(256).setDuration(1024).calculate(); assertEquals(1024 >> 9, calculator.getDuration(), messageDuration); assertEquals(VP[10], calculator.getConsumption(), messageEUt); } @Test void weirdAmpHatchOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setAmperage(320).setDuration(1024).calculate(); assertEquals(1024 >> 9, calculator.getDuration(), messageDuration); assertEquals(VP[10], calculator.getConsumption(), messageEUt); } @Test void parallelImperfectOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[8]).setAmperage(4) .setDuration(1024).setParallel(16).calculate(); assertEquals(1024 >> 6, calculator.getDuration(), messageDuration); assertEquals(VP[9], calculator.getConsumption(), messageEUt); } @Test void parallelPerfectOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[8]).setAmperage(4) .setDuration(4096).setParallel(16).enablePerfectOC().calculate(); assertEquals(4096 >> 12, calculator.getDuration(), messageDuration); assertEquals(VP[9], calculator.getConsumption(), messageEUt); } @Test void parallelMultiAmpOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setAmperage(320).setDuration(1024).setParallel(16).calculate(); assertEquals(1024 >> 7, calculator.getDuration(), messageDuration); assertEquals(VP[10], calculator.getConsumption(), messageEUt); } @Test void weirdParallelOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[8]) .setDuration(1024).setParallel(8).calculate(); assertEquals(1024 >> 5, calculator.getDuration(), messageDuration); assertEquals(VP[6] * 8, calculator.getConsumption(), messageEUt); } @Test void weirdParallelAndAmpsOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[8]) .setAmperage(320).setDuration(1024).setParallel(8).calculate(); assertEquals(1024 >> 9, calculator.getDuration(), messageDuration); assertEquals(VP[6] * 8 * 256, calculator.getConsumption(), messageEUt); } @Test void weirdTimeOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setDuration(77).calculate(); assertEquals(77 >> 5, calculator.getDuration(), messageDuration); assertEquals(VP[6], calculator.getConsumption(), messageEUt); } @Test void stopsCorrectlyWhenOneTicking_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]).setDuration(1) .calculate(); assertEquals(1, calculator.getDuration(), messageDuration); assertEquals(VP[1], calculator.getConsumption(), messageEUt); } @Test void imperfectOCWithEUtDiscount_Test() { long correctConsumption = (long) Math.ceil(VP[1] * 0.9f) << 10; GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setEUtDiscount(0.9f).setDuration(1024).calculate(); assertEquals(1024 >> 5, calculator.getDuration(), messageDuration); assertEquals(correctConsumption, calculator.getConsumption(), messageEUt); } @Test void perfectOCWithEUtDiscount_Test() { long correctConsumption = (long) Math.ceil(VP[1] * 0.9f) << 10; GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setEUtDiscount(0.9f).setDuration(1024).enablePerfectOC().calculate(); assertEquals(1024 >> 10, calculator.getDuration(), messageDuration); assertEquals(correctConsumption, calculator.getConsumption(), messageEUt); } @Test void imperfectOCWithSpeedBoost_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setSpeedBoost(0.9f).setDuration(1024).calculate(); assertEquals((int) (1024 * 0.9f) >> 5, calculator.getDuration(), messageDuration); assertEquals(VP[6], calculator.getConsumption(), messageEUt); } @Test void perfectOCWithSpeedBoost_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setSpeedBoost(0.9f).setDuration(2048).enablePerfectOC().calculate(); assertEquals((int) (2048 * 0.9f) >> 10, calculator.getDuration(), messageDuration); assertEquals(VP[6], calculator.getConsumption(), messageEUt); } @Test void oneTickDiscountTurnsToOne_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]).setDuration(1) .enableOneTickDiscount().calculate(); assertEquals(1, calculator.getDuration(), messageDuration); assertEquals(1, calculator.getConsumption(), messageEUt); } @Test void oneTickDiscountImperfectOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setSpeedBoost(1.1f).setDuration(4).enableOneTickDiscount().calculate(); assertEquals(1, calculator.getDuration(), messageDuration); assertEquals(480 >> 3, calculator.getConsumption(), messageEUt); } @Test void oneTickDiscountPerfectOC_Test() { GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[1]).setEUt(V[6]) .setSpeedBoost(1.1f).setDuration(16).enablePerfectOC().enableOneTickDiscount().calculate(); assertEquals(1, calculator.getDuration(), messageDuration); assertEquals(480 >> 6, calculator.getConsumption(), messageEUt); } @Test void ulvRecipeWithDiscount_Test() { long correctConsumption = (long) Math.ceil((VP[0] << 10) * 0.9f); GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[0]).setEUt(V[6]) .setEUtDiscount(0.9f).setDuration(1024).calculate(); assertEquals(1024 >> 5, calculator.getDuration(), messageDuration); assertEquals(correctConsumption, calculator.getConsumption(), messageEUt); } @Test void ulvRecipeWithDiscountWithParallel_Test() { long correctConsumption = (long) Math.ceil((VP[0] << 6) * 14 * 0.9f); GT_OverclockCalculator calculator = new GT_OverclockCalculator().setRecipeEUt(VP[0]).setEUt(V[5]) .setEUtDiscount(0.9f).setParallel(14).setDuration(1024).calculate(); assertEquals(1024 >> 3, calculator.getDuration(), messageDuration); assertEquals(correctConsumption, calculator.getConsumption(), messageEUt); } }