public void EvaluateNodeWritesToTopFrameStack()
        {
            // Create context
              var context = CreateContext();
              var symbol = SymbolTable.Symbols.TextToSymbol("id");
              // Insert value in lower frame
              context.SetLocalValue(symbol, 24);
              context.PushFrame("x", null, context.CurrentFrame);
              // Insert value in top frame
              context.SetLocalValue(symbol, 42);
              context.PushFrame("y", null, context.CurrentFrame);

              context.Data.Push(100);

              // Try evaluating
              var sut = new LocalIdentifierNode();
              var token = new TestToken(symbol);
              sut.Init(null, new ParseTreeNode(token));
              sut.EvaluateNode(context, AstMode.Write);

              var actual = context.CurrentFrame.Values[symbol];
              Assert.That(actual, Is.EqualTo(100));
              // Check that parent value is untouched. This is what differentiate LocalIdentifierNode from IdentifierNode
              Assert.That(context.CurrentFrame.Parent.Values[symbol], Is.EqualTo(42));
        }
        public void EvaluateNodeReadsFromTopMostSymbolInFrameStack()
        {
            // Create context
              var context = CreateContext();
              var symbol = SymbolTable.Symbols.TextToSymbol("id");
              // Insert value in lower frame
              context.SetLocalValue(symbol, 24);
              context.PushFrame("x", null, context.CurrentFrame);
              // Insert value in top frame
              context.SetLocalValue(symbol, 42);
              context.PushFrame("y", null, context.CurrentFrame);

              // Try evaluating
              var sut = new LocalIdentifierNode();
              var token = new TestToken(symbol);
              sut.Init(null, new ParseTreeNode(token));
              sut.EvaluateNode(context, AstMode.Read);

              var actual = context.LastResult;
              Assert.That(actual, Is.EqualTo(42));
        }