@Test
  public void testRefactorPackageName() throws Exception {
    CompilerAssert<File, File> helper = incrementalCompiler("model", "meta", "controller");
    helper.assertCompile();

    //
    File ser = helper.getSourceOutput().getPath("juzu", "metamodel.ser");
    MetaModel mm = Tools.unserialize(MetaModel.class, ser);
    mm.getQueue().clear();
    Tools.serialize(mm, ser);

    //
    File file = helper.getSourcePath().getPath("model", "meta", "controller", "A.java");
    File sub = new File(file.getParentFile(), "sub");
    assertTrue(sub.mkdir());
    File tmp = new File(sub, file.getName());
    assertTrue(file.renameTo(tmp));
    JavaFile javaFile = helper.assertJavaFile("model", "meta", "controller", "sub", "A.java");
    javaFile
        .assertCompilationUnit()
        .getPackage()
        .setName(ASTHelper.createNameExpr("model.meta.controller.sub"));
    javaFile.assertSave();

    //
    helper.addClassPath(helper.getClassOutput()).assertCompile();
    mm = Tools.unserialize(MetaModel.class, ser);

    //
    List<MetaModelEvent> events = mm.getQueue().clear();
    assertEquals(5, events.size());
    assertEquals(MetaModelEvent.BEFORE_REMOVE, events.get(0).getType());
    assertEquals(
        ElementHandle.Method.create(
            new FQN("model.meta.controller.A"), "index", Collections.<String>emptyList()),
        ((MethodMetaModel) events.get(0).getObject()).getHandle());
    assertEquals(MetaModelEvent.BEFORE_REMOVE, events.get(1).getType());
    assertEquals(
        ElementHandle.Class.create(new FQN("model.meta.controller.A")),
        ((ControllerMetaModel) events.get(1).getObject()).getHandle());
    assertEquals(MetaModelEvent.AFTER_ADD, events.get(2).getType());
    assertEquals(
        ElementHandle.Class.create(new FQN("model.meta.controller.sub.A")),
        ((ControllerMetaModel) events.get(2).getObject()).getHandle());
    assertEquals(MetaModelEvent.AFTER_ADD, events.get(3).getType());
    assertEquals(
        ElementHandle.Method.create(
            new FQN("model.meta.controller.sub.A"), "index", Collections.<String>emptyList()),
        ((MethodMetaModel) events.get(3).getObject()).getHandle());
    assertEquals(MetaModelEvent.UPDATED, events.get(4).getType());
    assertEquals(
        ElementHandle.Class.create(new FQN("model.meta.controller.sub.A")),
        ((ControllerMetaModel) events.get(4).getObject()).getHandle());
  }