/*
 * 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.parser;

import com.facebook.buck.model.BuildFileTree;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.util.Paths;
import com.facebook.buck.util.ProjectFilesystem;
import com.google.common.collect.ImmutableSet;

import java.io.File;
import java.util.Map;

/**
 * Factory for creating a {@link BuildRuleFactoryParams} that does not check whether the file
 * paths it creates actually exist. Designed to be used exclusively for testing.
 */
public final class NonCheckingBuildRuleFactoryParams {

  public static BuildRuleFactoryParams createNonCheckingBuildRuleFactoryParams(
      Map<String, ?> instance,
      BuildTargetParser buildTargetParser,
      BuildTarget target) {
    return new BuildRuleFactoryParams(
        instance,
        new ProjectFilesystem(new File(".")),
        new NonCheckingBuildFileTree(),
        buildTargetParser,
        target,
        true /* ignoreFileExistenceChecks */);
  }

  private static class NonCheckingBuildFileTree extends BuildFileTree {

    public NonCheckingBuildFileTree() {
      super(ImmutableSet.<BuildTarget>of());
    }

    @Override
    public Iterable<String> getChildPaths(BuildTarget buildTarget) {
      return ImmutableSet.of();
    }

    @Override
    public String getBasePathOfAncestorTarget(String filePath) {
      // Always assume the file is local to the target.
      return Paths.normalizePathSeparator(new File(filePath).getParent());
    }
  }

}
