/// <summary> /// Adds modules to the spec builder based on a string-based dependency chain. E.g. "A -> B -> C -> D". No actual projects are added to /// the modules /// </summary> internal static SpecEvaluationBuilder AddModuleDependency(this SpecEvaluationBuilder builder, params string[] dependencyChains) { var moduleChains = dependencyChains.Select( dependencyChain => dependencyChain.Split(new[] { "->" }, StringSplitOptions.RemoveEmptyEntries).Select(name => name.Trim()).ToArray()); // Collect all direct dependencies for each module var dependencies = new MultiValueDictionary <string, string>(); foreach (var modules in moduleChains) { // We expect at least one dependency pair Contract.Assert(modules.Length >= 2); for (var i = 0; i < modules.Length - 1; i++) { dependencies.Add(modules[i], modules[i + 1]); } // We add the last module with no dependencies so the set of modules is complete dependencies.Add(modules[modules.Length - 1]); } // Add one module per module name, with the corresponding allowed dependencies foreach (var moduleWithDependencies in dependencies) { var moduleName = moduleWithDependencies.Key; builder.AddFile( I($"{moduleName}/package.config.dsc"), DsTest.CreatePackageConfig(moduleName, useImplicitReferenceSemantics: true, allowedDependencies: moduleWithDependencies.Value.ToList())); } // We always want to evaluate everything builder.RootSpec(Names.ConfigBc); return(builder); }
/// <summary> /// Constructor that captures <see cref="DsTest"/>. /// </summary> public SpecEvaluationBuilder(DsTest test) { Contract.Requires(test != null); m_test = test; }