/*
 * Copyright 2013-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.rules;

import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.testutil.MoreAsserts;
import com.google.common.collect.ImmutableList;

import org.junit.Test;

public class SourcePathsTest {

  @Test
  public void testEmptyListAsInputToFilterInputsToCompareToOutput() {
    Iterable<SourcePath> sourcePaths = ImmutableList.of();
    Iterable<String> inputs = SourcePaths.filterInputsToCompareToOutput(sourcePaths);
    MoreAsserts.assertIterablesEquals(ImmutableList.<String>of(), inputs);
  }

  @Test
  public void testFilterInputsToCompareToOutputExcludesBuildTargetSourcePaths() {
    Iterable<? extends SourcePath> sourcePaths = ImmutableList.of(
        new FileSourcePath("java/com/facebook/Main.java"),
        new FileSourcePath("java/com/facebook/BuckConfig.java"),
        new BuildTargetSourcePath(BuildTargetFactory.newInstance("//java/com/facebook:facebook")));
    Iterable<String> inputs = SourcePaths.filterInputsToCompareToOutput(sourcePaths);
    MoreAsserts.assertIterablesEquals(
        "Iteration order should be preserved: results should not be alpha-sorted.",
        ImmutableList.of("java/com/facebook/Main.java", "java/com/facebook/BuckConfig.java"),
        inputs);
  }
}
