package table;

import static org.junit.Assert.*;

import org.junit.*;

import sexpression.*;

public class SymbolTableTester {

    private SymbolTable symbolTable;

    @Before
    public void setUp() {
        symbolTable = new SymbolTable();
    }

    @Test
    public void lookupSymbolNotInTable() {
        assertFalse(symbolTable.contains("symbol"));
    }

    @Test
    public void lookupSymbolInTable() {
        symbolTable.put("symbol", Symbol.T);

        assertTrue(symbolTable.contains("symbol"));
    }

    @Test
    public void retrieveSymbolValue() {
        symbolTable.put("symbol", Symbol.T);

        assertEquals(Symbol.T, symbolTable.get("symbol"));
    }

    @Test
    public void redefineSymbolValue() {
        symbolTable.put("symbol", Symbol.T);
        symbolTable.put("symbol", Nil.getInstance());

        assertEquals(Nil.getInstance(), symbolTable.get("symbol"));
    }

    @Test
    public void checkParentTableIsCorrect() {
        SymbolTable childTable = new SymbolTable(symbolTable);

        assertEquals(symbolTable, childTable.getParent());
    }

    @Test
    public void lookupSymbolInParentTable() {
        symbolTable.put("symbol", Symbol.T);
        SymbolTable childTable = new SymbolTable(symbolTable);
        SymbolTable parentTable = childTable.getParent();

        assertEquals(Symbol.T, parentTable.get("symbol"));
    }

}
