package com.oracle.truffle.llvm.tests.interop;
import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.llvm.tests.interop.values.DoubleArrayObject;
import com.oracle.truffle.llvm.tests.interop.values.LongArrayObject;
import com.oracle.truffle.tck.TruffleRunner;
import com.oracle.truffle.tck.TruffleRunner.Inject;
import java.util.ArrayList;
import java.util.Collection;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
@Parameterized.UseParametersRunnerFactory(TruffleRunner.ParametersFactory.class)
public final class ManagedMemmoveTest extends ManagedMemAccessTestBase {
@Parameters(name = "{1}->{0}")
public static Collection<Object[]> data() {
ArrayList<Object[]> tests = new ArrayList<>();
for (int i = 0; i < TestType.values().length; i++) {
for (int j = 0; j < TestType.values().length; j++) {
tests.add(new Object[]{TestType.values()[i], TestType.values()[j]});
}
}
return tests;
}
@Parameter(0) public TestType dstTestType;
@Parameter(1) public TestType srcTestType;
public static class DoMemmoveNode extends SulongTestNode {
public DoMemmoveNode() {
super(testLibrary, "do_memmove");
}
}
@Test
public void memmove(@Inject(DoMemmoveNode.class) CallTarget doMemmove) {
Object srcType = getTypeID(srcTestType);
Object dstType = getTypeID(dstTestType);
final int arrayLength = 8;
int size = arrayLength * srcTestType.elementSize;
Object srcArray;
Object srcObject;
if (srcTestType.isFloating) {
double[] src = new double[arrayLength];
for (int i = 0; i < arrayLength; i++) {
src[i] = i;
}
srcArray = src;
srcObject = new DoubleArrayObject(srcType, src);
} else {
long[] src = new long[arrayLength];
for (int i = 0; i < arrayLength; i++) {
src[i] = i;
}
srcArray = src;
srcObject = new LongArrayObject(srcType, src);
}
byte[] srcBytes = serialize(srcTestType, srcArray);
Object dstArray;
Object dstObject;
if (dstTestType.isFloating) {
double[] dst = new double[size / dstTestType.elementSize];
dstArray = dst;
dstObject = new DoubleArrayObject(dstType, dst);
} else {
long[] dst = new long[size / dstTestType.elementSize];
dstArray = dst;
dstObject = new LongArrayObject(dstType, dst);
}
doMemmove.call(dstObject, srcObject, size);
byte[] dstBytes = serialize(dstTestType, dstArray);
Assert.assertArrayEquals(srcBytes, dstBytes);
}
}