LanguageProvider provides factory methods for language data types, expressions,
statements and scripts used for testing language inter-operability. The LanguageProvider
implementations are loaded by the ServiceLoader and should be registered in the
'META-INF/services/org.graalvm.polyglot.tck.LanguageProvider'. See
Test
Compatibility Kit for details how to add a new language provider and execute tests.
| Modifier and Type | Method and Description |
|---|---|
| public default Map | Returns: The(key, value) pairs of language option to add to the context.Allows language providers to provide language options during the creation of the test context. |
| public Collection | Returns: factories creating the language expressionsthe context for a guest language code literal evaluation context)Creates a collection of functions representing language expressions to test. |
| public Value | Returns: theValue representing the identity functionthe context for a guest language code literal evaluation context)Creates an identity function. |
| public default Snippet | Returns: theSnippet representing the identity functionthe context for a guest language code literal evaluation context)Creates a |
| public default Collection | Returns: A collection of inline code snippets.the context for a guest language code literal evaluation context)Creates a collection of inline code snippets. |
| public Collection | Returns: the scriptsthe context for a guest language code literal evaluation context)Creates a collection of scripts containing a syntax error. |
| public Collection | Returns: the language scriptsthe context for a guest language code literal evaluation context)Creates a collection of simple scripts used for instrumentation testing. |
| public Collection | Returns: factories creating the language statementsthe context for a guest language code literal evaluation context)Creates a collection of functions representing language statements to test. |
| public Collection | Returns: factories creating the language data typesthe context for a guest language code literal evaluation context)Creates a collection of functions creating language data types. |
| public String |
| additionalOptions | back to summary |
|---|---|
| public default Map Allows language providers to provide language options during the creation of the test
context. | |
| createExpressions | back to summary |
|---|---|
| public Collection Creates a collection of functions representing language expressions to test. For each
language operator create a function performing given operator and assign a correct
The JavaScript sample implementation creating a plus operator:
@Override
public Collection<? extends Snippet> createExpressions(Context context) {
final Collection<Snippet> expressions = new ArrayList<>();
final TypeDescriptor numeric = TypeDescriptor.union(
TypeDescriptor.NUMBER,
TypeDescriptor.BOOLEAN);
final TypeDescriptor nonNumeric = TypeDescriptor.union(
TypeDescriptor.STRING,
TypeDescriptor.OBJECT,
TypeDescriptor.ARRAY,
TypeDescriptor.EXECUTABLE_ANY);
Snippet.Builder builder = Snippet.newBuilder(
"+",
context.eval("js",
"(function (a, b){ return a + b;})"),
TypeDescriptor.NUMBER).parameterTypes(numeric, numeric);
expressions.add(builder.build());
builder = Snippet.newBuilder(
"+",
context.eval("js",
"(function (a, b){ return a + b;})"),
TypeDescriptor.STRING).parameterTypes(nonNumeric, TypeDescriptor.ANY);
expressions.add(builder.build());
builder = Snippet.newBuilder(
"+",
context.eval("js",
"(function (a, b){ return a + b;})"),
TypeDescriptor.STRING).parameterTypes(TypeDescriptor.ANY, nonNumeric);
expressions.add(builder.build());
return expressions;
}
The R sample implementation creating a plus operator:
@Override
public Collection<? extends Snippet> createExpressions(Context context) {
final Collection<Snippet> expressions = new ArrayList<>();
final TypeDescriptor numOrBool = TypeDescriptor.union(
TypeDescriptor.NUMBER,
TypeDescriptor.BOOLEAN);
final TypeDescriptor arrNumOrBool = TypeDescriptor.array(
numOrBool);
final TypeDescriptor numeric = TypeDescriptor.union(
numOrBool,
arrNumOrBool);
Snippet.Builder builder = Snippet.newBuilder(
"+",
context.eval("R",
"function (a, b){ a + b}"),
numeric).parameterTypes(numeric, numeric);
expressions.add(builder.build());
return expressions;
}
| |
| createIdentityFunction | back to summary |
|---|---|
| public Value createIdentityFunction(Context context) Creates an identity function. The identity function just returns its argument. The JavaScript sample implementation:
@Override
public Value createIdentityFunction(Context context) {
return context.eval("js", "(function (a){ return a; })");
}
The R sample implementation:
@Override
public Value createIdentityFunction(Context context) {
return context.eval("R", "function (a){ a }");
}
| |
| createIdentityFunctionSnippet | back to summary |
|---|---|
| public default Snippet createIdentityFunctionSnippet(Context context) Creates a
The implementor can delegate to the default identity function verifier obtained by
| |
| createInlineScripts | back to summary |
|---|---|
| public default Collection Creates a collection of inline code snippets.
This method is optional, it should be implemented if
The JavaScript sample implementation creating inline code snippets:
@Override
public Collection<? extends InlineSnippet> createInlineScripts(Context context) {
final Collection<InlineSnippet> inlineScripts = new ArrayList<>();
Snippet.Builder scriptBuilder = Snippet.newBuilder(
"factorial",
context.eval("js",
"(function (){\n" +
" let factorial = function(n) {\n" +
" let f = 1;\n" +
" for (let i = 2; i <= n; i++) {\n" +
" f *= i;\n" +
" }\n" +
" };\n" +
" return factorial(10);\n" +
"})"),
TypeDescriptor.NUMBER);
InlineSnippet.Builder builder = InlineSnippet.newBuilder(
scriptBuilder.build(),
"n * n").locationPredicate((SourceSection section) -> {
int line = section.getStartLine();
return 3 <= line && line <= 6;
});
inlineScripts.add(builder.build());
builder = InlineSnippet.newBuilder(
scriptBuilder.build(),
"Math.sin(Math.PI)");
inlineScripts.add(builder.build());
return inlineScripts;
}
| |
| createInvalidSyntaxScripts | back to summary |
|---|---|
| public Collection Creates a collection of scripts containing a syntax error. The JavaScript sample implementation:
@Override
public Collection<? extends Source> createInvalidSyntaxScripts(Context ctx) {
try {
final Collection
| |
| createScripts | back to summary |
|---|---|
| public Collection Creates a collection of simple scripts used for instrumentation testing. Each script is
represented as a function performing the script. The function must have no formal parameters
but may return a result which can be asserted by The JavaScript sample implementation:
@Override
public Collection<? extends Snippet> createScripts(Context context) {
try {
final Collection<Snippet> scripts = new ArrayList<>();
Reader reader = new InputStreamReader(
getClass().getResourceAsStream("sample.js"),
"UTF-8");
Source source = Source.newBuilder(
"js",
reader,
"sample.js").build();
Snippet.Builder builder = Snippet.newBuilder(
source.getName(),
context.eval(source),
TypeDescriptor.NULL);
scripts.add(builder.build());
return scripts;
} catch (IOException ioe) {
throw new RuntimeException(ioe);
}
}
| |
| createStatements | back to summary |
|---|---|
| public Collection Creates a collection of functions representing language statements to test. For each control
flow statement create a function performing given statement and assign a correct
The JavaScript sample implementation creating the
@Override
public Collection<? extends Snippet> createStatements(Context context) {
final Collection<Snippet> statements = new ArrayList<>();
Snippet.Builder builder = Snippet.newBuilder(
"if",
context.eval("js",
"(function (p){\n" +
" if (p) return true ; else return false;\n" +
"})"),
TypeDescriptor.BOOLEAN).parameterTypes(
TypeDescriptor.union(
TypeDescriptor.STRING,
TypeDescriptor.OBJECT,
TypeDescriptor.NUMBER,
TypeDescriptor.BOOLEAN));
statements.add(builder.build());
return statements;
}
The R sample implementation creating the
@Override
public Collection<? extends Snippet> createStatements(Context context) {
final Collection<Snippet> statements = new ArrayList<>();
final TypeDescriptor numberOrBoolean = TypeDescriptor.union(
TypeDescriptor.NUMBER,
TypeDescriptor.BOOLEAN);
final TypeDescriptor arrayNumberOrBoolean = TypeDescriptor.array(
numberOrBoolean);
Snippet.Builder builder = Snippet.newBuilder(
"if",
context.eval("R",
"function(p){\n" +
" if (p) { return (TRUE) } else { return (FALSE) }\n" +
"}"),
TypeDescriptor.BOOLEAN).parameterTypes(
TypeDescriptor.union(
numberOrBoolean,
arrayNumberOrBoolean));
statements.add(builder.build());
return statements;
}
| |
| createValueConstructors | back to summary |
|---|---|
| public Collection Creates a collection of functions creating language data types. For each language data type
create a function returning a value of given type and assign a correct The JavaScript sample implementation creating a boolean type:
| |
| getId | back to summary |
|---|---|
| public String getId() Returns an identification of a provider. The common pattern is to use the identification of the tested language.
| |