symbol_table_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package compiler
  2. import "testing"
  3. func TestDefine(t *testing.T) {
  4. expected := map[string]Symbol{
  5. "a": {"a", GlobalScope, 0},
  6. "b": {"b", GlobalScope, 1},
  7. "c": {"c", LocalScope, 0},
  8. "d": {"d", LocalScope, 1},
  9. "e": {"e", LocalScope, 0},
  10. "f": {"f", LocalScope, 1},
  11. }
  12. global := NewSymbolTable()
  13. a := global.Define("a")
  14. if a != expected["a"] {
  15. t.Errorf("expected a=%+v, got=%+v", expected["a"], a)
  16. }
  17. b := global.Define("b")
  18. if b != expected["b"] {
  19. t.Errorf("expected b=%+v, got=%+v", expected["b"], b)
  20. }
  21. firstLocal := NewEnclosedSymbolTable(global)
  22. c := firstLocal.Define("c")
  23. if c != expected["c"] {
  24. t.Errorf("expected c=%+v, got=%+v", expected["c"], c)
  25. }
  26. d := firstLocal.Define("d")
  27. if d != expected["d"] {
  28. t.Errorf("expected d=%+v, got=%+v", expected["d"], d)
  29. }
  30. secondLocal := NewEnclosedSymbolTable(firstLocal)
  31. e := secondLocal.Define("e")
  32. if e != expected["e"] {
  33. t.Errorf("expeted e=%+v, got=%+v", expected["e"], e)
  34. }
  35. f := secondLocal.Define("f")
  36. if f != expected["f"] {
  37. t.Errorf("expected f=%+v, got=%+v", expected["f"], f)
  38. }
  39. }
  40. func TestResolveGlobal(t *testing.T) {
  41. global := NewSymbolTable()
  42. global.Define("a")
  43. global.Define("b")
  44. expected := []Symbol{
  45. {Name: "a", Scope: GlobalScope, Index: 0},
  46. {Name: "b", Scope: GlobalScope, Index: 1},
  47. }
  48. for _, sym := range expected {
  49. result, ok := global.Resolve(sym.Name)
  50. if !ok {
  51. t.Errorf("name %s not resolvable", sym.Name)
  52. continue
  53. }
  54. if result != sym {
  55. t.Errorf("expected %s to resolve to %+v, got=%+v",
  56. sym.Name, sym, result)
  57. }
  58. }
  59. }
  60. func TestResolveLocal(t *testing.T) {
  61. global := NewSymbolTable()
  62. global.Define("a")
  63. global.Define("b")
  64. local := NewEnclosedSymbolTable(global)
  65. local.Define("c")
  66. local.Define("d")
  67. expected := []Symbol{
  68. {Name: "a", Scope: GlobalScope, Index: 0},
  69. {Name: "b", Scope: GlobalScope, Index: 1},
  70. {Name: "c", Scope: LocalScope, Index: 0},
  71. {Name: "d", Scope: LocalScope, Index: 1},
  72. }
  73. for _, sym := range expected {
  74. result, ok := local.Resolve(sym.Name)
  75. if !ok {
  76. t.Errorf("name %s not resolvable", sym.Name)
  77. continue
  78. }
  79. if result != sym {
  80. t.Errorf("expected %s to resolve to %+v, got=%+v", sym.Name, sym, result)
  81. }
  82. }
  83. }
  84. func TestResolveNestedLocal(t *testing.T) {
  85. global := NewSymbolTable()
  86. global.Define("a")
  87. global.Define("b")
  88. firstLocal := NewEnclosedSymbolTable(global)
  89. firstLocal.Define("c")
  90. firstLocal.Define("d")
  91. secondLocal := NewEnclosedSymbolTable(firstLocal)
  92. secondLocal.Define("e")
  93. secondLocal.Define("f")
  94. tests := []struct {
  95. table *SymbolTable
  96. expectedSymbols []Symbol
  97. }{
  98. {
  99. firstLocal,
  100. []Symbol{
  101. {"a", GlobalScope, 0},
  102. {"b", GlobalScope, 1},
  103. {"c", LocalScope, 0},
  104. {"d", LocalScope, 1},
  105. },
  106. },
  107. {
  108. secondLocal,
  109. []Symbol{
  110. {"a", GlobalScope, 0},
  111. {"b", GlobalScope, 1},
  112. {"e", LocalScope, 0},
  113. {"f", LocalScope, 1},
  114. },
  115. },
  116. }
  117. for _, tt := range tests {
  118. for _, sym := range tt.expectedSymbols {
  119. result, ok := tt.table.Resolve(sym.Name)
  120. if !ok {
  121. t.Errorf("name %s not resolvable", sym.Name)
  122. continue
  123. }
  124. if result != sym {
  125. t.Errorf("expected %s resolve to %+v, got=%+v", sym.Name, sym, result)
  126. }
  127. }
  128. }
  129. }