@Test
  public void testWindowParenting02CreateVisibleDestroy3Odd() throws InterruptedException {
    int x = 0;
    int y = 0;

    NEWTEventFiFo eventFifo = new NEWTEventFiFo();

    GLWindow glWindow1 = GLWindow.create(glCaps);
    GLEventListener demo1 = new RedSquare();
    setDemoFields(demo1, glWindow1, false);
    glWindow1.addGLEventListener(demo1);

    NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow1);

    Frame frame = new Frame("AWT Parent Frame");
    Assert.assertNotNull(frame);
    frame.setSize(width, height);

    // visible test
    frame.setVisible(true);

    frame.add(newtCanvasAWT);

    Animator animator1 = new Animator(glWindow1);
    animator1.start();
    while (animator1.isAnimating() && animator1.getDuration() < durationPerTest) {
      Thread.sleep(100);
    }

    Assert.assertEquals(true, animator1.isAnimating()); // !!!

    frame.dispose();
    glWindow1.destroy(true);
  }
  @Test
  public void testWindowParenting04ReparentNewtWin2TopLayouted() throws InterruptedException {
    int x = 0;
    int y = 0;

    NEWTEventFiFo eventFifo = new NEWTEventFiFo();

    GLWindow glWindow1 = GLWindow.create(glCaps);
    GLEventListener demo1 = new RedSquare();
    setDemoFields(demo1, glWindow1, false);
    glWindow1.addGLEventListener(demo1);

    NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow1);

    Frame frame = new Frame("AWT Parent Frame");
    frame.setLayout(new BorderLayout());
    frame.add(new Button("North"), BorderLayout.NORTH);
    frame.add(new Button("South"), BorderLayout.SOUTH);
    frame.add(new Button("East"), BorderLayout.EAST);
    frame.add(new Button("West"), BorderLayout.WEST);
    frame.setSize(width, height);
    frame.setLocation(640, 480);
    frame.setVisible(true);

    frame.add(newtCanvasAWT, BorderLayout.CENTER);
    Assert.assertEquals(newtCanvasAWT.getNativeWindow(), glWindow1.getParentNativeWindow());

    Animator animator1 = new Animator(glWindow1);
    animator1.start();

    int state = 0;
    while (animator1.isAnimating() && animator1.getDuration() < 3 * durationPerTest) {
      Thread.sleep(durationPerTest);
      switch (state) {
        case 0:
          glWindow1.reparentWindow(null, null);
          Assert.assertEquals(true, glWindow1.isNativeWindowValid());
          Assert.assertNull(glWindow1.getParentNativeWindow());
          break;
        case 1:
          glWindow1.reparentWindow(newtCanvasAWT.getNativeWindow(), null);
          Assert.assertEquals(true, glWindow1.isNativeWindowValid());
          Assert.assertEquals(newtCanvasAWT.getNativeWindow(), glWindow1.getParentNativeWindow());
          break;
      }
      state++;
    }

    animator1.stop();
    Assert.assertEquals(false, animator1.isAnimating());

    frame.dispose();
    glWindow1.destroy(true);
  }
  @Test
  public void testWindowParenting01CreateVisibleDestroy1() throws InterruptedException {
    int x = 0;
    int y = 0;

    NEWTEventFiFo eventFifo = new NEWTEventFiFo();

    GLWindow glWindow1 = GLWindow.create(glCaps);
    Assert.assertNotNull(glWindow1);
    Assert.assertEquals(false, glWindow1.isVisible());
    Assert.assertEquals(false, glWindow1.isNativeWindowValid());
    Assert.assertNull(glWindow1.getParentNativeWindow());
    glWindow1.setTitle("testWindowParenting01CreateVisibleDestroy");
    GLEventListener demo1 = new RedSquare();
    setDemoFields(demo1, glWindow1, false);
    glWindow1.addGLEventListener(demo1);

    NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow1);
    Assert.assertNotNull(newtCanvasAWT);
    Assert.assertEquals(false, glWindow1.isVisible());
    Assert.assertEquals(false, glWindow1.isNativeWindowValid());
    Assert.assertNull(glWindow1.getParentNativeWindow());

    Frame frame1 = new Frame("AWT Parent Frame");
    frame1.setLayout(new BorderLayout());
    frame1.add(new Button("North"), BorderLayout.NORTH);
    frame1.add(new Button("South"), BorderLayout.SOUTH);
    frame1.add(new Button("East"), BorderLayout.EAST);
    frame1.add(new Button("West"), BorderLayout.WEST);

    Container container1 = new Container();
    container1.setLayout(new BorderLayout());
    container1.add(new Button("north"), BorderLayout.NORTH);
    container1.add(new Button("south"), BorderLayout.SOUTH);
    container1.add(new Button("east"), BorderLayout.EAST);
    container1.add(new Button("west"), BorderLayout.WEST);
    container1.add(newtCanvasAWT, BorderLayout.CENTER);

    frame1.add(container1, BorderLayout.CENTER);
    frame1.setSize(width, height);

    // visible test
    frame1.setVisible(true);
    Assert.assertEquals(newtCanvasAWT.getNativeWindow(), glWindow1.getParentNativeWindow());

    Animator animator1 = new Animator(glWindow1);
    animator1.start();
    while (animator1.isAnimating() && animator1.getDuration() < durationPerTest) {
      Thread.sleep(100);
    }
    animator1.stop();
    Assert.assertEquals(false, animator1.isAnimating());

    frame1.setVisible(false);
    Assert.assertEquals(false, glWindow1.isDestroyed());

    frame1.setVisible(true);
    Assert.assertEquals(false, glWindow1.isDestroyed());

    frame1.remove(newtCanvasAWT);
    // Assert.assertNull(glWindow1.getParentNativeWindow());
    Assert.assertEquals(false, glWindow1.isDestroyed());

    frame1.dispose();
    Assert.assertEquals(false, glWindow1.isDestroyed());

    glWindow1.destroy(true);
    // Assert.assertEquals(true, glWindow1.isDestroyed());
  }
  public void testWindowParenting1AWTTwoNewtChilds()
      throws InterruptedException, InvocationTargetException {
    Frame frame1 = new Frame("AWT Parent Frame");
    GLWindow glWindow1 = GLWindow.create(glCaps);
    glWindow1.setUpdateFPSFrames(1, null);
    NewtCanvasAWT newtCanvasAWT1 = new NewtCanvasAWT(glWindow1);
    newtCanvasAWT1.setPreferredSize(size);

    GLEventListener demo1 = new GearsES2(1);
    setDemoFields(demo1, glWindow1, false);
    glWindow1.addGLEventListener(demo1);
    glWindow1.addKeyListener(new NewtAWTReparentingKeyAdapter(frame1, newtCanvasAWT1, glWindow1));
    GLAnimatorControl animator1 = new Animator(glWindow1);
    animator1.start();

    GLWindow glWindow2 = GLWindow.create(glCaps);
    glWindow2.setUpdateFPSFrames(1, null);
    NewtCanvasAWT newtCanvasAWT2 = new NewtCanvasAWT(glWindow2);
    newtCanvasAWT2.setPreferredSize(size);

    GLEventListener demo2 = new GearsES2(1);
    setDemoFields(demo2, glWindow2, false);
    glWindow2.addGLEventListener(demo2);
    glWindow2.addKeyListener(new NewtAWTReparentingKeyAdapter(frame1, newtCanvasAWT2, glWindow2));
    GLAnimatorControl animator2 = new Animator(glWindow2);
    animator2.start();

    Container cont1 = new Container();
    cont1.setLayout(new BorderLayout());
    cont1.add(newtCanvasAWT1, BorderLayout.CENTER);
    System.err.println("******* Cont1 setVisible");
    cont1.setVisible(true);

    Container cont2 = new Container();
    cont2.setLayout(new BorderLayout());
    cont2.add(newtCanvasAWT2, BorderLayout.CENTER);
    System.err.println("******* Cont2 setVisible");
    cont2.setVisible(true);
    final Container f_cont2 = cont2;

    frame1.setLayout(new BorderLayout());
    frame1.add(new Label("NORTH"), BorderLayout.NORTH);
    frame1.add(new Label("CENTER"), BorderLayout.CENTER);
    frame1.add(new Label("SOUTH"), BorderLayout.SOUTH);
    frame1.add(cont1, BorderLayout.EAST);
    frame1.setLocation(0, 0);
    frame1.setSize((int) size.getWidth() * 2, (int) size.getHeight() * 2);
    final Frame f_frame1 = frame1;
    javax.swing.SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            f_frame1.pack();
            System.err.println("******* Frame setVisible");
            f_frame1.setVisible(true);
          }
        });

    Assert.assertEquals(newtCanvasAWT1.getNativeWindow(), glWindow1.getParent());
    Assert.assertEquals(newtCanvasAWT2.getNativeWindow(), glWindow2.getParent());

    Assert.assertEquals(true, animator1.isAnimating());
    Assert.assertEquals(false, animator1.isPaused());
    Assert.assertNotNull(animator1.getThread());

    Assert.assertEquals(true, animator2.isAnimating());
    Assert.assertEquals(false, animator2.isPaused());
    Assert.assertNotNull(animator2.getThread());

    Thread.sleep(waitAdd2nd);

    javax.swing.SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            f_frame1.add(f_cont2, BorderLayout.WEST);
            f_frame1.pack();
          }
        });

    Thread.sleep(durationPerTest);

    animator1.stop();
    Assert.assertEquals(false, animator1.isAnimating());
    Assert.assertEquals(false, animator1.isPaused());
    Assert.assertEquals(null, animator1.getThread());

    animator2.stop();
    Assert.assertEquals(false, animator2.isAnimating());
    Assert.assertEquals(false, animator2.isPaused());
    Assert.assertEquals(null, animator2.getThread());

    frame1.dispose();
    glWindow1.destroy();
    glWindow2.destroy();
  }