package se.feomedia.orion.operation;

import com.artemis.World;
import com.artemis.WorldConfiguration;
import com.artemis.annotations.Wire;
import org.junit.Test;
import se.feomedia.orion.Executor;
import se.feomedia.orion.Operation;
import se.feomedia.orion.OperationTree;
import se.feomedia.orion.system.OperationSystem;

import static org.junit.Assert.*;
import static se.feomedia.orion.OperationFactory.*;

public class ExecutorEndTest {
	@Test
	public void end_test() {
		World world = new World(new WorldConfiguration()
			.setSystem(OperationSystem.class));

		FiniteOperation fo = operation(FiniteOperation.class);

		fo.register(world, world.create());

		world.process();

		assertEquals(1, fo.n);

		world.process();

		assertEquals(2, fo.n);

		world.process();

		assertEquals(-1, fo.n);
	}


	public static class FiniteOperation extends Operation {
		public int n = 0;

		@Override
		public Class<? extends Executor> executorType() {
			return FiniteExecutor.class;
		}

		@Override
		protected boolean isComplete() {
			return n > 2;
		}

		@Override
		public void reset() {

		}

		@Wire
		public static class FiniteExecutor extends Executor<FiniteOperation> {
			@Override
			protected float act(float delta, FiniteOperation operation, OperationTree node) {
				operation.n++;
				return 0;
			}

			@Override
			protected void begin(FiniteOperation operation, OperationTree node) {
				operation.n = 0;
			}

			@Override
			protected void end(FiniteOperation operation, OperationTree node) {
				operation.n = -1;
			}
		}
	}
}