Fiasko/src/test/java/inf112/fiasko/roborally/GdxTestRunner.java

111 lines
3.2 KiB
Java

/*
Copyright 2015 See AUTHORS file.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Downloaded from https://github.com/TomGrill/gdx-testing
*/
package inf112.fiasko.roborally;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.headless.HeadlessApplication;
import com.badlogic.gdx.backends.headless.HeadlessApplicationConfiguration;
import com.badlogic.gdx.graphics.GL20;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import java.util.HashMap;
import java.util.Map;
import static org.mockito.Mockito.mock;
public class GdxTestRunner extends BlockJUnit4ClassRunner implements ApplicationListener {
private final Map<FrameworkMethod, RunNotifier> invokeInRender = new HashMap<>();
public GdxTestRunner(Class<?> klass) throws InitializationError {
super(klass);
HeadlessApplicationConfiguration conf = new HeadlessApplicationConfiguration();
new HeadlessApplication(this, conf);
Gdx.gl = mock(GL20.class);
}
@Override
public void create() {
//Test runner doesn't need to create anything
}
@Override
public void resume() {
//Pausing and resuming isn't needed for testing
}
@Override
public void render() {
synchronized (invokeInRender) {
for (Map.Entry<FrameworkMethod, RunNotifier> each : invokeInRender.entrySet()) {
super.runChild(each.getKey(), each.getValue());
}
invokeInRender.clear();
}
}
@Override
public void resize(int width, int height) {
//Resizing a headless application doesn't make sense
}
@Override
public void pause() {
//Pausing and resuming isn't needed for testing
}
@Override
public void dispose() {
//Nothing created means nothing to dispose
}
@Override
protected void runChild(FrameworkMethod method, RunNotifier notifier) {
synchronized (invokeInRender) {
// add for invoking in render phase, where gl context is available
invokeInRender.put(method, notifier);
}
// wait until that test was invoked
waitUntilInvokedInRenderMethod();
}
/**
*
*/
private void waitUntilInvokedInRenderMethod() {
try {
while (true) {
Thread.sleep(10);
synchronized (invokeInRender) {
if (invokeInRender.isEmpty())
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}