/* * Copyright 2017-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.js; import com.facebook.buck.apple.AppleLibraryBuilder; import com.facebook.buck.io.ProjectFilesystem; import com.facebook.buck.model.BuildTarget; import com.facebook.buck.model.BuildTargetFactory; import com.facebook.buck.model.Either; import com.facebook.buck.model.Pair; import com.facebook.buck.parser.NoSuchBuildTargetException; import com.facebook.buck.rules.BuildRuleResolver; import com.facebook.buck.rules.DefaultTargetNodeToBuildRuleTransformer; import com.facebook.buck.rules.SourcePath; import com.facebook.buck.rules.TargetGraph; import com.facebook.buck.rules.TargetNode; import com.facebook.buck.shell.ExportFileBuilder; import com.facebook.buck.shell.FakeWorkerBuilder; import com.facebook.buck.testutil.FakeProjectFilesystem; import com.facebook.buck.testutil.TargetGraphFactory; import com.facebook.buck.util.MoreCollectors; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.stream.Stream; import javax.annotation.Nullable; public class JsTestScenario { final TargetGraph targetGraph; final BuildRuleResolver resolver; final BuildTarget workerTarget; final ProjectFilesystem filesystem; static Builder builder() { return new Builder(); } static Builder builder(JsTestScenario other) { return new Builder(other); } private JsTestScenario( TargetGraph targetGraph, BuildRuleResolver resolver, BuildTarget workerTarget, ProjectFilesystem filesystem) { this.targetGraph = targetGraph; this.resolver = resolver; this.workerTarget = workerTarget; this.filesystem = filesystem; } JsBundle createBundle(String target, ImmutableSortedSet<BuildTarget> deps) throws NoSuchBuildTargetException { return createBundle(target, deps, Either.ofLeft(ImmutableSet.of())); } private JsBundle createBundle( String target, ImmutableSortedSet<BuildTarget> deps, Either<ImmutableSet<String>, String> entry) throws NoSuchBuildTargetException { return new JsBundleBuilder( BuildTargetFactory.newInstance(target), workerTarget, entry, filesystem) .setDeps(deps) .build(resolver, targetGraph); } static class Builder { private final Set<TargetNode<?, ?>> nodes = new LinkedHashSet<>(); private final BuildTarget workerTarget; private final ProjectFilesystem filesystem; private Builder() { workerTarget = BuildTargetFactory.newInstance("//worker:tool"); nodes.add(new FakeWorkerBuilder(workerTarget).build()); filesystem = new FakeProjectFilesystem(); } private Builder(JsTestScenario other) { nodes.addAll(other.targetGraph.getNodes()); workerTarget = other.workerTarget; filesystem = other.filesystem; } Builder bundleWithDeps(BuildTarget target, BuildTarget... dependencies) { return bundle(target, ImmutableSortedSet.copyOf(dependencies)); } Builder bundle(BuildTarget target, ImmutableSortedSet<BuildTarget> deps) { final Either<ImmutableSet<String>, String> entry = Either.ofLeft(ImmutableSet.of()); nodes.add(new JsBundleBuilder(target, workerTarget, entry, filesystem).setDeps(deps).build()); return this; } Builder library(BuildTarget target, BuildTarget... libraryDependencies) { nodes.add( new JsLibraryBuilder(target, filesystem) .setLibs(ImmutableSortedSet.copyOf(libraryDependencies)) .setWorker(workerTarget) .build()); return this; } Builder library(BuildTarget target, SourcePath first, SourcePath... sources) { addLibrary( target, null, Stream.concat(Stream.of(first), Stream.of(sources)).map(Either::ofLeft)); return this; } Builder library(BuildTarget target, String basePath, SourcePath... sources) { addLibrary(target, basePath, Stream.of(sources).map(Either::ofLeft)); return this; } Builder library(BuildTarget target, String basePath, Pair<SourcePath, String> source) { addLibrary(target, basePath, Stream.of(source).map(Either::ofRight)); return this; } private void addLibrary( BuildTarget target, @Nullable String basePath, Stream<Either<SourcePath, Pair<SourcePath, String>>> sources) { nodes.add( new JsLibraryBuilder(target, filesystem) .setBasePath(basePath) .setSrcs(sources.collect(MoreCollectors.toImmutableSet())) .setWorker(workerTarget) .build()); } Builder arbitraryRule(BuildTarget target) { nodes.add(ExportFileBuilder.newExportFileBuilder(target).build()); return this; } Builder appleLibraryWithDeps(BuildTarget target, BuildTarget... deps) { nodes.add( AppleLibraryBuilder.createBuilder(target) .setDeps(ImmutableSortedSet.copyOf(deps)) .build()); return this; } JsTestScenario build() throws NoSuchBuildTargetException { final TargetGraph graph = TargetGraphFactory.newInstance(nodes); final BuildRuleResolver resolver = new BuildRuleResolver(graph, new DefaultTargetNodeToBuildRuleTransformer()); for (TargetNode<?, ?> node : nodes) { resolver.requireRule(node.getBuildTarget()); } return new JsTestScenario(graph, resolver, workerTarget, filesystem); } } }