ForgePatch/src/test/java/net/minecraftforge/test/TestProgressBar.java

196 lines
6.4 KiB
Java

/*
* Minecraft Forge
* Copyright (c) 2016-2018.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.test;
import net.minecraftforge.fml.common.progress.IProgressBarTracker;
import net.minecraftforge.fml.common.progress.ProgressBar;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class TestProgressBar
{
private static String getStepMessage(int step)
{
if (step == 0)
{
return "";
}
return "testStep" + step;
}
private static void checkBarState(int step, String message, int expectedStepValue, int totalSteps)
{
if (step != expectedStepValue)
{
throw new IllegalStateException("Got step " + step + " but expected " + expectedStepValue);
}
if (step > totalSteps)
{
throw new IllegalStateException("ProgressBar stepped past the total: " + step + "/" + totalSteps);
}
String expectedMessage = getStepMessage(expectedStepValue);
if (!message.equals(expectedMessage))
{
throw new IllegalStateException("Got message '" + message + "' but expected '" + expectedMessage + "'");
}
}
@Test
public void testProgressBar()
{
String title = "testTitle";
final int totalSteps = 20;
IProgressBarTracker tracker = new TestProgressBarTracker(totalSteps, title);
try (ProgressBar progressBar = new ProgressBar(title, totalSteps, s -> s, tracker))
{
String barTitle = progressBar.getTitle();
if (!title.equals(barTitle))
{
throw new IllegalStateException("Got title " + barTitle + " but expected " + title);
}
for (int i = 1; i <= totalSteps; i++) {
progressBar.step(getStepMessage(i));
}
}
}
@Test
public void testThreadedProgressBar()
{
String title = "testTitle";
final int totalSteps = 10;
TestProgressBarTracker tracker = new TestProgressBarTracker(totalSteps, title);
AtomicBoolean threadSawBar = new AtomicBoolean(false);
Thread thread = new Thread(() ->
{
List<ProgressBar> bars = TestProgressBarTracker.getBars();
while (bars.isEmpty())
{
Thread.yield();
bars = TestProgressBarTracker.getBars();
}
while (!bars.isEmpty())
{
for (ProgressBar bar : bars)
{
Pair<Integer, String> stepAndMessage = bar.getStepAndMessage();
int step = stepAndMessage.getLeft();
String message = stepAndMessage.getRight();
checkBarState(step, message, step, totalSteps);
threadSawBar.set(true);
}
Thread.yield();
bars = TestProgressBarTracker.getBars();
}
});
thread.start();
try (ProgressBar progressBar = new ProgressBar(title, totalSteps, s -> s, tracker))
{
String barTitle = progressBar.getTitle();
if (!title.equals(barTitle))
{
throw new IllegalStateException("Got title " + barTitle + " but expected " + title);
}
for (int i = 1; i <= totalSteps; i++) {
progressBar.step(getStepMessage(i));
try
{
Thread.sleep(1);
}
catch (InterruptedException ignored)
{
}
}
}
if (!threadSawBar.get())
{
throw new IllegalStateException("Thread never saw any progress bars");
}
}
private static class TestProgressBarTracker implements IProgressBarTracker
{
private static final List<ProgressBar> bars = new CopyOnWriteArrayList<>();
private final AtomicInteger stepped = new AtomicInteger(0);
private final int totalSteps;
private final String title;
public TestProgressBarTracker(int totalSteps, String title)
{
this.totalSteps = totalSteps;
this.title = title;
}
@Override
public void onBarCreated(ProgressBar bar)
{
bars.add(bar);
int expectedStepCount = 0;
Pair<Integer, String> stepAndMessage = bar.getStepAndMessage();
Integer step = stepAndMessage.getLeft();
String message = stepAndMessage.getRight();
checkBarState(step, message, expectedStepCount, totalSteps);
}
@Override
public void onStepStarted(ProgressBar bar, int step, String message)
{
int expectedStepCount = stepped.incrementAndGet();
checkBarState(step, message, expectedStepCount, totalSteps);
}
@Override
public void onStepFinished(ProgressBar bar, int step, String message)
{
int expectedStepCount = stepped.get();
checkBarState(step, message, expectedStepCount, totalSteps);
}
@Override
public void onBarFinished(ProgressBar bar, int step, String message)
{
bars.remove(bar);
int expectedStepCount = stepped.get();
checkBarState(step, message, expectedStepCount, totalSteps);
if (step != totalSteps)
{
throw new IllegalStateException("ProgressBar did not finish: " + title + ".\nSteps: " + step + "/" + totalSteps);
}
}
public static List<ProgressBar> getBars()
{
return bars;
}
}
}