/*
 * Copyright 2012-present Facebook, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package com.facebook.buck.android;

import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.replay;

import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.rules.BuildContext;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
import com.facebook.buck.testutil.MoreAsserts;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;

import org.junit.Test;

public class AndroidLibraryRuleTest {

  @Test
  public void testGetInputsToCompareToOuts() {
    BuildRuleResolver params = new BuildRuleResolver();
    AndroidLibraryRule androidLibraryRuleBuilderFoo = getAndroidLibraryRuleFoo(params);
    AndroidLibraryRule androidLibraryRuleBuilderBar = getAndroidLibraryRuleBar(params);
    BuildContext context = createMock(BuildContext.class);
    replay(context);

    MoreAsserts.assertListEquals(
        "getInputsToCompareToOutput() should include manifest and src.",
        ImmutableList.of(
            "java/src/com/foo/Foo.java",
            "java/src/com/foo/AndroidManifest.xml"),
        androidLibraryRuleBuilderFoo.getInputsToCompareToOutput());

    MoreAsserts.assertListEquals(
        "getInputsToCompareToOutput() should include only src.",
        ImmutableList.of(
            "java/src/com/bar/Bar.java"),
        androidLibraryRuleBuilderBar.getInputsToCompareToOutput());
  }

  private AndroidLibraryRule getAndroidLibraryRuleFoo(BuildRuleResolver params) {
    return (AndroidLibraryRule)params.buildAndAddToIndex(
        AndroidLibraryRule.newAndroidLibraryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
        .setBuildTarget(BuildTargetFactory.newInstance("//java/src/com/foo:foo"))
        .addSrc("java/src/com/foo/Foo.java")
        .setManifestFile((Optional.of("java/src/com/foo/AndroidManifest.xml"))));
  }

  private AndroidLibraryRule getAndroidLibraryRuleBar(BuildRuleResolver params) {
    return (AndroidLibraryRule)params.buildAndAddToIndex(
        AndroidLibraryRule.newAndroidLibraryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
        .setBuildTarget(BuildTargetFactory.newInstance("//java/src/com/bar:bar"))
        .addSrc("java/src/com/bar/Bar.java")
        .setManifestFile((Optional.<String>absent())));
  }
}
