public async Task InvalidatesAllWithSameSource() { // Given TestDocument a1 = new TestDocument(new NormalizedPath("/a"), "a1"); TestDocument a2 = new TestDocument(new NormalizedPath("/a"), "a2"); TestDocument a3 = new TestDocument(new NormalizedPath("/a"), "a3"); TestDocument b1 = new TestDocument(new NormalizedPath("/b"), "b"); List <string> missedContent = new List <string>(); CacheDocuments cacheDocuments = new CacheDocuments( new ExecuteConfig(Config.FromDocument(async doc => { missedContent.Add(await doc.GetContentStringAsync()); return(doc); })).WithParallelExecution(false)); // When _ = await ExecuteAsync(new[] { a1, a2, b1 }, cacheDocuments); IReadOnlyList <TestDocument> results = await ExecuteAsync(new[] { a1, a3, b1 }, cacheDocuments); // Then missedContent.ShouldBe(new[] { "a1", "a2", "b", "a1", "a3" }); results.Select(x => x.Content).ShouldBe(new[] { "b", "a1", "a3" }); }
public async Task DocumentDependenciesChange() { // Given TestDocument a1 = new TestDocument(new NormalizedPath("/a"), "a1"); TestDocument a2 = new TestDocument(new NormalizedPath("/a"), "a2"); TestDocument b1 = new TestDocument(new NormalizedPath("/b"), "b"); TestDocument d1 = new TestDocument(new NormalizedPath("/d1"), "d1"); TestDocument d2 = new TestDocument(new NormalizedPath("/d2"), "d2"); TestDocument d3 = new TestDocument(new NormalizedPath("/d2"), "d3"); List <string> missedContent = new List <string>(); CacheDocuments cacheDocuments = new CacheDocuments( new ExecuteConfig(Config.FromDocument(async doc => { missedContent.Add(await doc.GetContentStringAsync()); return(doc); })).WithParallelExecution(false)) .WithDocumentDependencies(Config.FromDocument(async doc => (await doc.GetContentStringAsync()).Equals("a2") ? (missedContent.Count == 0 ? new[] { d1, d2 } : new[] { d1, d3 }) : (IEnumerable <IDocument>)null)); // When _ = await ExecuteAsync(new[] { a1, a2, b1 }, cacheDocuments); IReadOnlyList <TestDocument> results = await ExecuteAsync(new[] { a1, a2, b1 }, cacheDocuments); // Then missedContent.ShouldBe(new[] { "a1", "a2", "b", "a1", "a2" }); results.Select(x => x.Content).ShouldBe(new[] { "b", "a1", "a2" }); }
public async Task CachesDocumentsForSameDependencies() { // Given TestDocument a1 = new TestDocument(new NormalizedPath("/a"), "a"); TestDocument b1 = new TestDocument(new NormalizedPath("/b"), "b"); TestDocument d1 = new TestDocument(new NormalizedPath("/d1"), "d1"); TestDocument d2 = new TestDocument(new NormalizedPath("/d2"), "d2"); TestExecutionContext executionContext = new TestExecutionContext(new[] { a1, b1 }); executionContext.Outputs.Dictionary["Foo"] = ImmutableArray.Create <IDocument>(d1, d2); List <string> missedContent = new List <string>(); CacheDocuments cacheDocuments = new CacheDocuments( new ExecuteConfig(Config.FromDocument(async doc => { missedContent.Add(await doc.GetContentStringAsync()); return(doc); })).WithParallelExecution(false)) .WithPipelineDependencies("Foo"); // When _ = await ExecuteAsync(executionContext, cacheDocuments); IReadOnlyList <TestDocument> results = await ExecuteAsync(executionContext, cacheDocuments); // Then missedContent.ShouldBe(new[] { "a", "b" }); results.Select(x => x.Content).ShouldBe(new[] { "a", "b" }); }
public async Task ResetsCache() { // Given TestDocument a1 = new TestDocument(new NormalizedPath("/a"), "a"); TestDocument b1 = new TestDocument(new NormalizedPath("/b"), "b"); TestDocument b2 = new TestDocument(new NormalizedPath("/b"), "b2"); TestExecutionContext executionContext1 = new TestExecutionContext(new[] { a1, b1 }); TestExecutionContext executionContext2 = new TestExecutionContext(new[] { a1, b2 }); executionContext2.Settings.Add(Keys.ResetCache, "true"); TestExecutionContext executionContext3 = new TestExecutionContext(new[] { a1, b2 }); List <string> missedContent = new List <string>(); CacheDocuments cacheDocuments = new CacheDocuments( new ExecuteConfig(Config.FromDocument(async doc => { missedContent.Add(await doc.GetContentStringAsync()); return(doc); })).WithParallelExecution(false)); // When _ = await ExecuteAsync(executionContext1, cacheDocuments); _ = await ExecuteAsync(executionContext2, cacheDocuments); IReadOnlyList <TestDocument> results = await ExecuteAsync(executionContext3, cacheDocuments); // Then missedContent.ShouldBe(new[] { "a", "b", "a", "b2", }); results.Select(x => x.Content).ShouldBe(new[] { "a", "b2" }); }
public async Task CachesDocuments() { // Given TestDocument a1 = new TestDocument(new FilePath("/input/a"), "a"); TestDocument b1 = new TestDocument(new FilePath("/input/b"), "b"); TestDocument a2 = new TestDocument(new FilePath("/input/a"), "aa"); TestDocument b2 = new TestDocument(new FilePath("/input/b"), "b"); CacheDocuments cacheDocuments = new CacheDocuments( new SetMetadata("Content", Config.FromDocument(async doc => await doc.GetContentStringAsync()))); // When _ = await ExecuteAsync(new[] { a1, b1 }, cacheDocuments); IReadOnlyList <TestDocument> results = await ExecuteAsync(new[] { a2, b2 }, cacheDocuments); // Then CollectionAssert.AreEqual(new[] { "b", "aa" }, results.Select(x => x["Content"])); CollectionAssert.AreEqual(new[] { b1.Id, a2.Id }, results.Select(x => x.Id)); }
public async Task OnlySendsCacheMissesToChildModules() { // Given TestDocument a1 = new TestDocument(new NormalizedPath("/a"), "a"); TestDocument b1 = new TestDocument(new NormalizedPath("/b"), "b"); TestDocument b2 = new TestDocument(new NormalizedPath("/b"), "b2"); List <string> missedContent = new List <string>(); CacheDocuments cacheDocuments = new CacheDocuments( new ExecuteConfig(Config.FromDocument(async doc => { missedContent.Add(await doc.GetContentStringAsync()); return(doc); })).WithParallelExecution(false)); // When _ = await ExecuteAsync(new[] { a1, b1 }, cacheDocuments); IReadOnlyList <TestDocument> results = await ExecuteAsync(new[] { a1, b2 }, cacheDocuments); // Then missedContent.ShouldBe(new[] { "a", "b", "b2" }); results.Select(x => x.Content).ShouldBe(new[] { "a", "b2" }); }
public async Task ExplicitlyInvalidateDocument() { // Given TestDocument a1 = new TestDocument(new NormalizedPath("/a"), "a"); TestDocument b1 = new TestDocument(new NormalizedPath("/b"), "b"); List <string> missedContent = new List <string>(); CacheDocuments cacheDocuments = new CacheDocuments( new ExecuteConfig(Config.FromDocument(async doc => { missedContent.Add(await doc.GetContentStringAsync()); return(doc); })).WithParallelExecution(false)) .InvalidateDocumentsWhere(Config.FromDocument(async doc => (await doc.GetContentStringAsync()).Equals("b"))); // When _ = await ExecuteAsync(new[] { a1, b1 }, cacheDocuments); IReadOnlyList <TestDocument> results = await ExecuteAsync(new[] { a1, b1 }, cacheDocuments); // Then missedContent.ShouldBe(new[] { "a", "b", "b" }); results.Select(x => x.Content).ShouldBe(new[] { "a", "b" }); }