package me.tomassetti.turin.compiler;
import me.tomassetti.turin.parser.ast.expressions.ValueReference;
import org.junit.Test;
import java.util.Optional;
import static org.junit.Assert.*;
public class LocalVarSymbolTableTest {
@Test
public void findInEmptySymbolTable() {
LocalVarsSymbolTable localVarsSymbolTable = LocalVarsSymbolTable.forInstanceMethod();
Optional<Integer> index = localVarsSymbolTable.findIndex("foo");
assertEquals(false, index.isPresent());
}
@Test
public void findOnlyValueSymbolTableForInstanceMethod() {
LocalVarsSymbolTable localVarsSymbolTable = LocalVarsSymbolTable.forInstanceMethod();
localVarsSymbolTable.add("foo", new ValueReference("foo"));
Optional<Integer> index = localVarsSymbolTable.findIndex("foo");
assertEquals(true, index.isPresent());
assertEquals(1, index.get().intValue());
}
@Test
public void findOnlyValueSymbolTableForStatucMethod() {
LocalVarsSymbolTable localVarsSymbolTable = LocalVarsSymbolTable.forStaticMethod();
localVarsSymbolTable.add("foo", new ValueReference("foo"));
Optional<Integer> index = localVarsSymbolTable.findIndex("foo");
assertEquals(true, index.isPresent());
assertEquals(0, index.get().intValue());
}
@Test
public void findAmongManyValuesSymbolTableForInstanceMethod() {
LocalVarsSymbolTable localVarsSymbolTable = LocalVarsSymbolTable.forInstanceMethod();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
Optional<Integer> index = localVarsSymbolTable.findIndex("foo2");
assertEquals(true, index.isPresent());
assertEquals(2, index.get().intValue());
}
@Test
public void findInInternalScopeSymbolTableForInstanceMethod() {
LocalVarsSymbolTable localVarsSymbolTable = LocalVarsSymbolTable.forInstanceMethod();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
localVarsSymbolTable.enterBlock();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
Optional<Integer> index = localVarsSymbolTable.findIndex("foo2");
assertEquals(true, index.isPresent());
assertEquals(5, index.get().intValue());
}
@Test
public void ignoreAbandonedScopeWhilefindInInternalScopeSymbolTableForInstanceMethod() {
LocalVarsSymbolTable localVarsSymbolTable = LocalVarsSymbolTable.forInstanceMethod();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
localVarsSymbolTable.enterBlock();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
localVarsSymbolTable.exitBlock();
Optional<Integer> index = localVarsSymbolTable.findIndex("foo2");
assertEquals(true, index.isPresent());
assertEquals(2, index.get().intValue());
}
@Test
public void findInVeryInternalScopeSymbolTableForInstanceMethod() {
LocalVarsSymbolTable localVarsSymbolTable = LocalVarsSymbolTable.forInstanceMethod();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
localVarsSymbolTable.enterBlock();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
localVarsSymbolTable.enterBlock();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
localVarsSymbolTable.enterBlock();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
localVarsSymbolTable.enterBlock();
localVarsSymbolTable.add("foo1", new ValueReference("foo1"));
localVarsSymbolTable.add("foo2", new ValueReference("foo2"));
localVarsSymbolTable.add("foo3", new ValueReference("foo3"));
Optional<Integer> index = localVarsSymbolTable.findIndex("foo2");
assertEquals(true, index.isPresent());
assertEquals(14, index.get().intValue());
}
}