@Test
 public void shouldInitializeContextTemporariesWhenVisitingTemporaries() {
   Temporaries temporaries = mock(Temporaries.class);
   when(temporaries.size()).thenReturn(2);
   analyser.visitBegin(temporaries);
   verify(writer).invokeContextTemporariesInit(2);
 }
 @Test
 public void shouldInvokePrimObjectArrayWhenVisitArray() {
   Array array = mock(Array.class);
   when(array.size()).thenReturn(2);
   analyser.visitBegin(array);
   verify(writer).invokeObjectArray(2);
 }
 @Test
 public void shouldInitializeTemporaryRegistryWhenVisitingTemporaries() {
   Temporaries temporaries = mock(Temporaries.class);
   analyser.visitBegin(temporaries);
   assertNotNull(analyser.temporariesRegistry());
   assertEquals(0, analyser.temporariesRegistry().size());
 }
 @Test
 public void shouldInitializeArgumentRegistryWhenVisitingBlockArguments() {
   BlockArguments blockArguments = mock(BlockArguments.class);
   analyser.visitBegin(blockArguments, 1);
   assertNotNull(analyser.argumentsRegistry());
   assertEquals(0, analyser.argumentsRegistry().size());
 }
 @Test
 public void shouldRegisterArgumentWhenVisitingBlockArgument() {
   BlockArguments blockArguments = mock(BlockArguments.class);
   BlockArgument blockArgument = mock(BlockArgument.class);
   analyser.visitBegin(blockArguments, 1);
   analyser.visit(blockArgument, "arg", 1);
   assertNotNull(analyser.argumentsRegistry());
   assertEquals(1, analyser.argumentsRegistry().size());
   assertEquals(0, (int) analyser.argumentsRegistry().get("arg"));
   assertEquals(1, analyser.argumentsIndex());
 }
 @Test
 public void shouldRegisterTemporaryWhenVisitingTemporary() {
   Temporaries temporaries = mock(Temporaries.class);
   Temporary temporary = mock(Temporary.class);
   analyser.visitBegin(temporaries);
   analyser.visit(temporary, "temp", 1);
   assertNotNull(analyser.temporariesRegistry());
   assertEquals(1, analyser.temporariesRegistry().size());
   assertEquals(0, (int) analyser.temporariesRegistry().get("temp"));
   assertEquals(1, analyser.temporariesIndex());
 }
 @Test
 public void shouldRegisterAndInvokeCompilerOfBlockWhenVisitBeginOfBlock() {
   Block block = mock(Block.class);
   when(parent.className()).thenReturn("SomeClass");
   when(parent.packageName()).thenReturn("st.redline");
   ProgramAnalyser spy = spy(analyser);
   SmalltalkEnvironment smalltalkEnvironment = mock(SmalltalkEnvironment.class);
   doReturn(smalltalkEnvironment).when(spy).smalltalkEnvironment();
   spy.visitBegin(block, 1);
   verify(smalltalkEnvironment).registerBlockToBeCompiled(block, "st.redline.SomeClass$M1");
   verify(writer).invokeObjectCompileBlock("st.redline.SomeClass$M1", 1);
 }
 @Test
 public void shouldOpenClassWhenVisitingProgramNodeBegins() {
   analyser.visitBegin(mock(Program.class));
   verify(writer).openClass();
 }
 @Test
 public void shouldDuplicateStackWhenCascadeBegins() {
   analyser.visitBegin(mock(Cascade.class));
   verify(writer).pushDuplicate();
 }