package me.tomassetti.turin.parser.ast;
import me.tomassetti.turin.resolvers.ResolverRegistry;
import me.tomassetti.turin.parser.Parser;
import me.tomassetti.turin.resolvers.InFileSymbolResolver;
import me.tomassetti.turin.resolvers.jdk.JdkTypeResolver;
import me.tomassetti.turin.resolvers.SymbolResolver;
import me.tomassetti.turin.parser.ast.expressions.ValueReference;
import me.tomassetti.turin.typesystem.ArrayTypeUsage;
import me.tomassetti.turin.typesystem.UnsignedPrimitiveTypeUsage;
import me.tomassetti.turin.typesystem.ReferenceTypeUsage;
import me.tomassetti.turin.typesystem.TypeUsage;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import static org.junit.Assert.*;
public class ValueReferenceTest {
@Test
public void solveReferenceToLocalVariable() throws IOException {
String code = "namespace examples\n" +
"program Example(String[] args) {\n" +
" val uint a = 0\n" +
" a\n" +
"}\n";
InputStream stream = new ByteArrayInputStream(code.getBytes(StandardCharsets.UTF_8));
TurinFile turinFile = new Parser().parse(stream);
List<ValueReference> valueReferences = turinFile.findAll(ValueReference.class);
assertEquals(1, valueReferences.size());
SymbolResolver resolver = new InFileSymbolResolver(JdkTypeResolver.getInstance());
ResolverRegistry.INSTANCE.record(turinFile, resolver);
TypeUsage type = valueReferences.get(0).calcType();
assertTrue(type.sameType(UnsignedPrimitiveTypeUsage.UINT));
}
@Test
public void solveReferenceToProgramParam() throws IOException {
String code = "namespace examples\n" +
"program Example(String[] args) {\n" +
" args\n" +
"}\n";
InputStream stream = new ByteArrayInputStream(code.getBytes(StandardCharsets.UTF_8));
TurinFile turinFile = new Parser().parse(stream);
List<ValueReference> valueReferences = turinFile.findAll(ValueReference.class);
assertEquals(1, valueReferences.size());
SymbolResolver resolver = new InFileSymbolResolver(JdkTypeResolver.getInstance());
ResolverRegistry.INSTANCE.record(turinFile, resolver);
TypeUsage type = valueReferences.get(0).calcType();
assertTrue(new ArrayTypeUsage(ReferenceTypeUsage.STRING(resolver)).sameType(type));
}
@Test
public void solveReferenceToMethodParam() throws IOException {
String code = "namespace examples\n" +
"type Example {\n" +
" void foo(int a) = a\n" +
"}\n";
InputStream stream = new ByteArrayInputStream(code.getBytes(StandardCharsets.UTF_8));
TurinFile turinFile = new Parser().parse(stream);
List<ValueReference> valueReferences = turinFile.findAll(ValueReference.class);
assertEquals(1, valueReferences.size());
SymbolResolver resolver = new InFileSymbolResolver(JdkTypeResolver.getInstance());
ResolverRegistry.INSTANCE.record(turinFile, resolver);
TypeUsage type = valueReferences.get(0).calcType();
assertTrue(type.isPrimitive());
assertTrue(type.asPrimitiveTypeUsage().isInt());
}
}