package org.multiverse.stms.gamma.transactionalobjects;
import org.junit.Before;
import org.junit.Test;
import org.multiverse.api.functions.Functions;
import org.multiverse.api.functions.LongFunction;
import org.multiverse.stms.gamma.GammaConstants;
import org.multiverse.stms.gamma.GammaObjectPool;
import org.multiverse.stms.gamma.GammaStm;
import org.multiverse.stms.gamma.transactionalobjects.Tranlocal;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.multiverse.stms.gamma.GammaTestUtils.assertHasCommutingFunctions;
public class AddCommutingFunctionTest implements GammaConstants {
private GammaObjectPool pool;
private GammaStm stm;
@Before
public void setUp() {
stm = new GammaStm();
pool = new GammaObjectPool();
}
@Test
public void whenFirstAddition() {
Tranlocal tranlocal = new Tranlocal();
tranlocal.mode = TRANLOCAL_COMMUTING;
tranlocal.addCommutingFunction(pool, Functions.incLongFunction(1));
assertFalse(tranlocal.isRead());
assertTrue(tranlocal.isCommuting());
assertEquals(0, tranlocal.long_value);
assertHasCommutingFunctions(tranlocal, Functions.incLongFunction(1));
}
@Test
public void whenMultipleAdditions() {
Tranlocal tranlocal = new Tranlocal();
tranlocal.mode = TRANLOCAL_COMMUTING;
LongFunction function1 = mock(LongFunction.class);
LongFunction function2 = mock(LongFunction.class);
LongFunction function3 = mock(LongFunction.class);
tranlocal.addCommutingFunction(pool, function1);
tranlocal.addCommutingFunction(pool, function2);
tranlocal.addCommutingFunction(pool, function3);
assertFalse(tranlocal.isRead());
assertTrue(tranlocal.isCommuting());
assertEquals(0, tranlocal.long_value);
assertHasCommutingFunctions(tranlocal, function3, function2, function1);
}
}