@@ -0,0 +1,1711 @@
+package org.realityforge.arez.api2;%0A%0Aimport org.realityforge.guiceyloops.shared.ValueUtil;%0Aimport org.testng.annotations.Test;%0Aimport static org.testng.Assert.*;%0A%0Apublic class ObserverTest%0A  extends AbstractArezTest%0A%7B%0A  @Test%0A  public void initialState()%0A    throws Exception%0A  %7B%0A    final ArezContext context = new ArezContext();%0A    final String name = ValueUtil.randomString();%0A    final int nextNodeId = context.currentNextNodeId();%0A    final Observer observer = new Observer( context, name );%0A%0A    // Verify all %22Node%22 behaviour%0A    assertEquals( observer.getContext(), context );%0A    assertEquals( observer.getName(), name );%0A    assertEquals( observer.getId(), nextNodeId );%0A    assertEquals( observer.toString(), name );%0A%0A    // Starts out inactive and inactive means no dependencies%0A    assertEquals( observer.getState(), ObserverState.INACTIVE );%0A    assertEquals( observer.isActive(), false );%0A    assertEquals( observer.isInactive(), true );%0A    assertEquals( observer.getDependencies().size(), 0 );%0A%0A    // All the hooks start out null%0A    assertEquals( observer.getOnActivate(), null );%0A    assertEquals( observer.getOnDeactivate(), null );%0A    assertEquals( observer.getOnStale(), null );%0A%0A    final Action onActivate = () -%3E %7B%0A    %7D;%0A    final Action onDeactivate = () -%3E %7B%0A    %7D;%0A    final Action onStale = () -%3E %7B%0A    %7D;%0A%0A    // Ensure hooks can be modified%0A    observer.setOnActivate( onActivate );%0A    observer.setOnDeactivate( onDeactivate );%0A    observer.setOnStale( onStale );%0A%0A    assertEquals( observer.getOnActivate(), onActivate );%0A    assertEquals( observer.getOnDeactivate(), onDeactivate );%0A    assertEquals( observer.getOnStale(), onStale );%0A%0A    observer.invariantState();%0A  %7D%0A%7D%0A

Add start of tests for Observer