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 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;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@RunWith(Parameterized.class)
@Parameterized.UseParametersRunnerFactory(TruffleRunner.ParametersFactory.class)
public final class ManagedMemsetTest 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++) {
tests.add(new Object[]{TestType.values()[i], (byte) 0});
tests.add(new Object[]{TestType.values()[i], (byte) 1});
tests.add(new Object[]{TestType.values()[i], (byte) -1});
tests.add(new Object[]{TestType.values()[i], (byte) 17});
}
return tests;
}
@Parameter(0) public TestType dstTestType;
@Parameter(1) public byte value;
public static class DoMemsetNode extends SulongTestNode {
public DoMemsetNode() {
super(testLibrary, "do_memset");
}
}
@Test
public void memset(@Inject(DoMemsetNode.class) CallTarget doMemset) {
Object dstType = getTypeID(dstTestType);
final int arrayLength = 8;
int size = arrayLength * dstTestType.elementSize;
Object dstArray;
Object dstObject;
if (dstTestType.isFloating) {
double[] dst = new double[arrayLength];
dstArray = dst;
dstObject = new DoubleArrayObject(dstType, dst);
} else {
long[] dst = new long[arrayLength];
dstArray = dst;
dstObject = new LongArrayObject(dstType, dst);
}
doMemset.call(dstObject, value, size);
byte[] dstBytes = serialize(dstTestType, dstArray);
byte[] expected = new byte[size];
Arrays.fill(expected, value);
Assert.assertArrayEquals(expected, dstBytes);
}
}