package com.oracle.truffle.nfi.test.parser;
import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.nfi.spi.types.NativeSimpleType;
import com.oracle.truffle.nfi.test.parser.backend.TestSignature;
import com.oracle.truffle.tck.TruffleRunner;
import com.oracle.truffle.tck.TruffleRunner.Inject;
import java.util.ArrayList;
import java.util.Collection;
import static org.hamcrest.CoreMatchers.is;
import org.hamcrest.core.Every;
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 class SimpleParseSignatureTest extends ParseSignatureTest {
@Parameters(name = "{0}")
public static Collection<Object[]> data() {
ArrayList<Object[]> ret = new ArrayList<>();
for (NativeSimpleType type : NativeSimpleType.values()) {
ret.add(new Object[]{type});
}
return ret;
}
@Parameter public NativeSimpleType type;
public class ParseNoArgs extends ParseSignatureNode {
public ParseNoArgs() {
super("():%s", type);
}
}
@Test
public void testNoArgs(@Inject(ParseNoArgs.class) CallTarget parse) {
TestSignature signature = getSignature(parse, 0);
Assert.assertEquals("return type", signature.retType, type);
Assert.assertEquals("argument count", 0, signature.argTypes.size());
}
public class ParseOneArg extends ParseSignatureNode {
public ParseOneArg() {
super("(%s):void", type);
}
}
@Test
public void testOneArg(@Inject(ParseOneArg.class) CallTarget parse) {
TestSignature signature = getSignature(parse, 1);
Assert.assertEquals("return type", signature.retType, NativeSimpleType.VOID);
Assert.assertEquals("argument count", 1, signature.argTypes.size());
Assert.assertThat("argument types", signature.argTypes, Every.everyItem(is(type)));
}
public class ParseTwoArgs extends ParseSignatureNode {
public ParseTwoArgs() {
super("(%s, %s):void", type, type);
}
}
@Test
public void testTwoArgs(@Inject(ParseTwoArgs.class) CallTarget parse) {
TestSignature signature = getSignature(parse, 2);
Assert.assertEquals("return type", signature.retType, NativeSimpleType.VOID);
Assert.assertEquals("argument count", 2, signature.argTypes.size());
Assert.assertThat("argument types", signature.argTypes, Every.everyItem(is(type)));
}
public class ParseArrayArg extends ParseSignatureNode {
public ParseArrayArg() {
super("([%s]):void", type);
}
}
@Test
public void testArrayArg(@Inject(ParseArrayArg.class) CallTarget parse) {
TestSignature signature = getSignature(parse, 1);
Assert.assertThat("return type", signature.retType, is(NativeSimpleType.VOID));
Assert.assertEquals("argument count", 1, signature.argTypes.size());
Assert.assertThat("argument types", signature.argTypes, Every.everyItem(isArrayType(type)));
}
public class ParseArrayRet extends ParseSignatureNode {
public ParseArrayRet() {
super("():[%s]", type);
}
}
@Test
public void testArrayRet(@Inject(ParseArrayRet.class) CallTarget parse) {
TestSignature signature = getSignature(parse, 0);
Assert.assertEquals("argument count", 0, signature.argTypes.size());
Assert.assertThat("return type", signature.retType, isArrayType(type));
}
}