# $Id: test_symrec.py,v 1.1.1.1 2012/03/29 17:20:59 uid42307 Exp $
from tests import TestCase, add
from yasm import SymbolTable, Expression, YasmError

class TSymbolTable(TestCase):
    def setUp(self):
        self.symtab = SymbolTable()

    def test_keys(self):
        self.assertEquals(len(self.symtab.keys()), 0)
        self.symtab.declare("foo", None, 0)
        keys = self.symtab.keys()
        self.assertEquals(len(keys), 1)
        self.assertEquals(keys[0], "foo")

    def test_contains(self):
        self.assert_("foo" not in self.symtab)
        self.symtab.declare("foo", None, 0)
        self.assert_("foo" in self.symtab)

    def test_exception(self):
        expr = Expression('+', 1, 2)
        self.symtab.define_equ("foo", expr, 0)
        self.assertRaises(YasmError, self.symtab.define_equ, "foo", expr, 0)
        self.symtab.define_equ("bar", expr, 0) # cleared
        self.assertRaises(YasmError, self.symtab.define_special, "bar",
                'global')

    def test_iters(self):
        tab = self.symtab
        tab.declare("foo", None, 0)
        tab.declare("bar", None, 0)
        tab.declare("baz", None, 0)

        # while ordering is not known, it must be consistent
        self.assertEquals(list(tab.keys()), list(tab.iterkeys()))
        self.assertEquals(list(tab.values()), list(tab.itervalues()))
        self.assertEquals(list(tab.items()), list(tab.iteritems()))
        self.assertEquals(list(tab.iteritems()), zip(tab.keys(), tab.values()))

add(TSymbolTable)

class TSymbolAttr(TestCase):
    def setUp(self):
        self.symtab = SymbolTable()
        self.declsym = self.symtab.declare("foo", None, 0)

    def test_visibility(self):
        sym = self.symtab.declare("local1", None, 0)
        self.assertEquals(sym.visibility, set())
        sym = self.symtab.declare("local2", '', 0)
        self.assertEquals(sym.visibility, set())
        sym = self.symtab.declare("local3", 'local', 0)
        self.assertEquals(sym.visibility, set())
        sym = self.symtab.declare("global", 'global', 0)
        self.assertEquals(sym.visibility, set(['global']))
        sym = self.symtab.declare("common", 'common', 0)
        self.assertEquals(sym.visibility, set(['common']))
        sym = self.symtab.declare("extern", 'extern', 0)
        self.assertEquals(sym.visibility, set(['extern']))
        sym = self.symtab.declare("dlocal", 'dlocal', 0)
        self.assertEquals(sym.visibility, set(['dlocal']))

        self.assertRaises(ValueError,
                          lambda: self.symtab.declare("extern2", 'foo', 0))
    def test_name(self):
        self.assertEquals(self.declsym.name, "foo")

    def test_equ(self):
        self.assertRaises(AttributeError, lambda: self.declsym.equ)

    def test_label(self):
        self.assertRaises(AttributeError, lambda: self.declsym.label)

    def test_is_special(self):
        self.assertEquals(self.declsym.is_special, False)

    def test_is_curpos(self):
        self.assertEquals(self.declsym.is_curpos, False)

add(TSymbolAttr)
