private static void assertThemeUsed(ActionBarIconGenerator.Theme theme, @Nullable Color color)
      throws Exception {
    ArgumentCaptor<ActionBarIconGenerator.ActionBarOptions> argument =
        ArgumentCaptor.forClass(ActionBarIconGenerator.ActionBarOptions.class);

    ActionBarIconGenerator generator = mock(ActionBarIconGenerator.class);

    TemplateWizardState state = new TemplateWizardState();
    AssetStudioAssetGenerator studioGenerator =
        new AssetStudioAssetGenerator(
            new TemplateWizardContextAdapter(state), generator, null, null);
    pickImage(state);
    state.put(ATTR_ASSET_TYPE, AssetType.ACTIONBAR.name());
    state.put(ATTR_ASSET_THEME, theme.name());
    state.put(ATTR_FOREGROUND_COLOR, color);
    studioGenerator.generateImages(true);

    verify(generator, times(1))
        .generate(
            isNull(String.class),
            any(Map.class),
            eq(studioGenerator),
            argument.capture(),
            anyString());

    assertEquals(theme, argument.getValue().theme);

    if (color != null && theme.equals(ActionBarIconGenerator.Theme.CUSTOM)) {
      assertEquals(color.getRGB(), argument.getValue().customThemeColor);
    }
  }
  public void testImageSource() throws Exception {
    myState.put(ATTR_SOURCE_TYPE, SourceType.IMAGE);

    ArgumentCaptor<ActionBarIconGenerator.ActionBarOptions> argument = runImageTest();

    BufferedImage expectedImage = getImage(myState.getString(ATTR_IMAGE_PATH), false);

    assertImagesSimilar("ImageImage", expectedImage, argument.getValue().sourceImage, 5.0f);
  }
  public void testClipartSource() throws Exception {
    myState.put(ATTR_SOURCE_TYPE, SourceType.CLIPART);

    ArgumentCaptor<ActionBarIconGenerator.ActionBarOptions> argument = runImageTest();

    BufferedImage expectedImage =
        GraphicGenerator.getClipartImage(myState.getString(ATTR_CLIPART_NAME));
    assertImagesSimilar("ClipartImage", expectedImage, argument.getValue().sourceImage, 5.0f);
  }
  public void testTextSource() throws Exception {
    myState.put(ATTR_SOURCE_TYPE, SourceType.TEXT);

    ArgumentCaptor<ActionBarIconGenerator.ActionBarOptions> argument = runImageTest();

    TextRenderUtil.Options options = new TextRenderUtil.Options();
    options.font = Font.decode(myState.getString(ATTR_FONT) + " " + myState.getInt(ATTR_FONT_SIZE));
    options.foregroundColor = 0xFFFFFFFF;
    BufferedImage expectedImage =
        TextRenderUtil.renderTextImage(myState.getString(ATTR_TEXT), 1, options);

    assertImagesSimilar("TextImage", expectedImage, argument.getValue().sourceImage, 5.0f);
  }
  public void testActionBarIcons() throws Exception {
    myState.put(ATTR_ASSET_TYPE, AssetType.ACTIONBAR.name());
    myAssetGenerator.generateImages(true);

    verify(myNotificationIconGenerator, never())
        .generate(any(GraphicGeneratorContext.class), any(GraphicGenerator.Options.class));
    verify(myNotificationIconGenerator, never())
        .generate(
            anyString(),
            any(Map.class),
            any(GraphicGeneratorContext.class),
            any(GraphicGenerator.Options.class),
            anyString());

    verify(myActionBarIconGenerator, never())
        .generate(eq(myAssetGenerator), any(ActionBarIconGenerator.ActionBarOptions.class));
    verify(myActionBarIconGenerator, times(1))
        .generate(
            isNull(String.class),
            any(Map.class),
            eq(myAssetGenerator),
            any(ActionBarIconGenerator.ActionBarOptions.class),
            eq(ASSET_NAME));

    verify(myLauncherIconGenerator, never())
        .generate(any(GraphicGeneratorContext.class), any(GraphicGenerator.Options.class));
    verify(myLauncherIconGenerator, never())
        .generate(
            anyString(),
            any(Map.class),
            any(GraphicGeneratorContext.class),
            any(GraphicGenerator.Options.class),
            anyString());
  }
  private ArgumentCaptor<ActionBarIconGenerator.ActionBarOptions> runImageTest() throws Exception {
    ArgumentCaptor<ActionBarIconGenerator.ActionBarOptions> argument =
        ArgumentCaptor.forClass(ActionBarIconGenerator.ActionBarOptions.class);
    myState.put(ATTR_ASSET_TYPE, AssetType.ACTIONBAR.name());
    myState.put(ATTR_ASSET_THEME, ActionBarIconGenerator.Theme.HOLO_DARK.name());

    myAssetGenerator.generateImages(true);

    verify(myActionBarIconGenerator, times(1))
        .generate(
            isNull(String.class),
            any(Map.class),
            eq(myAssetGenerator),
            argument.capture(),
            anyString());

    return argument;
  }
 @Override
 public void setUp() throws Exception {
   super.setUp();
   myNotificationIconGenerator = mock(NotificationIconGenerator.class);
   myActionBarIconGenerator = mock(ActionBarIconGenerator.class);
   myLauncherIconGenerator = mock(LauncherIconGenerator.class);
   myAssetGenerator =
       new AssetStudioAssetGenerator(
           new TemplateWizardContextAdapter(myState),
           myActionBarIconGenerator,
           myNotificationIconGenerator,
           myLauncherIconGenerator);
   pickImage(myState);
   myState.put(ATTR_ASSET_NAME, ASSET_NAME);
 }
 private static void pickImage(TemplateWizardState state) {
   // This is no longer done by the asset state by default, but by the
   // AssetSetStep#initialize method
   state.put(
       ATTR_IMAGE_PATH,
       new File(
               TemplateManager.getTemplateRootFolder(),
               FileUtil.join(
                   Template.CATEGORY_PROJECTS,
                   NewProjectWizardState.MODULE_TEMPLATE_NAME,
                   "root",
                   "res",
                   "drawable-xhdpi",
                   "ic_launcher.png"))
           .getAbsolutePath());
 }