private void addButtonCreate(Button button) {
   String buttonId = WidgetUtil.getId(button);
   writer.appendCreate(buttonId, "org.eclipse.swt.widgets.Button");
   writer.appendSet(buttonId, "parent", shellId);
   writer.appendSet(buttonId, "styles", new JsonArray().add("PUSH").add("BORDER"));
   writer.appendSet(buttonId, "text", "foo");
 }
  @Test
  public void testAppendSet_overwritesDuplicatePropertyInSameOperation() {
    writer.appendSet("id", "property", "value-1");
    writer.appendSet("id", "another-property", true);
    writer.appendSet("id", "property", "value-2");

    Message message = getMessage();
    assertEquals(1, message.getOperationCount());
    assertEquals("value-2", message.getOperation(0).getProperty("property").asString());
  }
  @Test
  public void testAppendSet_appendsSequentialPropertiesToSameOperation() {
    writer.appendSet("id", "property-1", "value-1");
    writer.appendSet("id", "property-2", 23);

    Message message = getMessage();
    assertEquals(1, message.getOperationCount());
    assertEquals("value-1", message.getOperation(0).getProperty("property-1").asString());
    assertEquals(23, message.getOperation(0).getProperty("property-2").asInt());
  }
  @Test
  public void testAppendSet_createsNewOperationWhenInterruptedByAnotherOperation() {
    writer.appendSet("id", "property", "value-1");
    writer.appendCall("id", "method", null);
    writer.appendSet("id", "property", "value-2");

    Message message = getMessage();
    assertEquals(3, message.getOperationCount());
    assertEquals("value-1", message.getOperation(0).getProperty("property").asString());
    assertEquals("value-2", message.getOperation(2).getProperty("property").asString());
  }
  @Test
  public void testDoesNotAppendToOtherWidgetsOperation() {
    Button button = new Button(shell, SWT.PUSH);
    String buttonId = WidgetUtil.getId(button);

    writer.appendSet(shellId, "key1", "value1");
    writer.appendSet(buttonId, "key2", "value2");

    Message message = getMessage();
    SetOperation firstOperation = (SetOperation) message.getOperation(0);
    assertEquals("value1", firstOperation.getProperty("key1").asString());
    assertFalse(firstOperation.getPropertyNames().contains("key2"));
  }
  @Test
  public void testAppendSet_createsNewOperationWhenInterruptedBySetForDifferentTarget() {
    writer.appendSet("id-1", "property", "value-1");
    writer.appendSet("id-2", "property", "value-2");
    writer.appendSet("id-1", "property", "value-3");

    Message message = getMessage();
    assertEquals(3, message.getOperationCount());
    assertEquals("id-1", message.getOperation(0).getTarget());
    assertEquals("value-1", message.getOperation(0).getProperty("property").asString());
    assertEquals("id-2", message.getOperation(1).getTarget());
    assertEquals("value-2", message.getOperation(1).getProperty("property").asString());
    assertEquals("id-1", message.getOperation(2).getTarget());
    assertEquals("value-3", message.getOperation(2).getProperty("property").asString());
  }
  @Test
  public void testAppendEmptyArrayParameter() {
    writer.appendSet(shellId, "key", new JsonArray());

    SetOperation operation = (SetOperation) getMessage().getOperation(0);
    assertEquals(0, operation.getProperty("key").asArray().size());
  }
  @Test
  public void testStartsNewOperation() {
    Button button = new Button(shell, SWT.PUSH);
    String buttonId = WidgetUtil.getId(button);

    writer.appendCreate(shellId, "foo.Class");
    writer.appendCreate(buttonId, "org.eclipse.swt.widgets.Button");
    writer.appendSet(buttonId, "parent", shellId);
    writer.appendSet(buttonId, "key1", "value1");
    writer.appendSet(buttonId, "key2", "value2");

    Message message = getMessage();
    CreateOperation createOperation = (CreateOperation) message.getOperation(1);
    assertEquals(shellId, createOperation.getParent());
    assertEquals("value1", createOperation.getProperty("key1").asString());
    assertEquals("value2", createOperation.getProperty("key2").asString());
  }
  @Test
  public void testAppendArrayParameter() {
    writer.appendSet(shellId, "key", new JsonArray().add(1).add(2));

    SetOperation operation = (SetOperation) getMessage().getOperation(0);
    JsonArray property = operation.getProperty("key").asArray();
    assertEquals(1, property.get(0).asInt());
    assertEquals(2, property.get(1).asInt());
  }
  @Test
  public void testAppendsToExistingSetOperation() {
    writer.appendSet(shellId, "key1", "value1");
    writer.appendSet(shellId, "key2", "value2");

    Message message = getMessage();
    SetOperation operation = (SetOperation) message.getOperation(0);
    assertEquals("value1", operation.getProperty("key1").asString());
    assertEquals("value2", operation.getProperty("key2").asString());
  }
  @Test
  public void testMessageWithCreate() {
    String displayId = DisplayUtil.getId(shell.getDisplay());
    String[] styles = new String[] {"TRIM", "FOO"};

    writer.appendCreate(shellId, "org.Text");
    writer.appendSet(shellId, "parent", displayId);
    writer.appendSet(shellId, "style", JsonUtil.createJsonArray(styles));
    writer.appendSet(shellId, "key1", "a");
    writer.appendSet(shellId, "key2", "b");

    CreateOperation operation = (CreateOperation) getMessage().getOperation(0);
    assertEquals(shellId, operation.getTarget());
    assertEquals(displayId, operation.getParent());
    assertEquals("org.Text", operation.getType());
    assertArrayEquals(styles, operation.getStyles());
    assertEquals("a", operation.getProperty("key1").asString());
    assertEquals("b", operation.getProperty("key2").asString());
  }
  @Test
  public void testAppendsToExistingCreateOperation() {
    writer.appendCreate(shellId, "foo.Class");
    writer.appendSet(shellId, "key1", "value1");
    writer.appendSet(shellId, "key2", "value2");

    Message message = getMessage();
    CreateOperation createOperation = (CreateOperation) message.getOperation(0);
    assertEquals("value1", createOperation.getProperty("key1").asString());
    assertEquals("value2", createOperation.getProperty("key2").asString());
  }
  @Test
  public void testAppendSet_createsSeparateOperationsForDifferentTargets() {
    writer.appendSet("id-1", "property", "value-1");
    writer.appendSet("id-2", "property", "value-2");

    Message message = getMessage();
    assertEquals(2, message.getOperationCount());
    assertEquals("id-1", message.getOperation(0).getTarget());
    assertEquals("value-2", message.getOperation(1).getProperty("property").asString());
    assertEquals("id-2", message.getOperation(1).getTarget());
    assertEquals("value-2", message.getOperation(1).getProperty("property").asString());
  }
  @Test
  public void testHasOperationsAfterAppend() {
    writer.appendSet("target", "foo", 23);

    assertTrue(writer.hasOperations());
  }
 private void addShellCreate(Shell shell) {
   writer.appendCreate(shellId, "org.eclipse.swt.widgets.Shell");
   writer.appendSet(shellId, "styles", new JsonArray().add("SHELL_TRIM"));
   writer.appendSet(shellId, "foo", 23);
 }