public void DocumentProcessed_DoesNothingIfSourceVersionsAreDifferent() { // Arrange var generatedDocumentPublisher = new Mock <GeneratedDocumentPublisher>(MockBehavior.Strict); var lastVersion = VersionStamp.Default.GetNewerVersion(); var lastDocument = TestDocumentSnapshot.Create("C:/path/old.cshtml", lastVersion); var document = TestDocumentSnapshot.Create("C:/path/file.cshtml", VersionStamp.Default); var cache = new TestDocumentVersionCache(new Dictionary <DocumentSnapshot, int?>() { [document] = 1338, [lastDocument] = 1337, }); var csharpDocument = RazorCSharpDocument.Create("Anything", RazorCodeGenerationOptions.CreateDefault(), Enumerable.Empty <RazorDiagnostic>()); var htmlDocument = RazorHtmlDocument.Create("Anything", RazorCodeGenerationOptions.CreateDefault()); // Force the state to already be up-to-date document.State.HostDocument.GeneratedDocumentContainer.SetOutput(lastDocument, csharpDocument, htmlDocument, lastVersion, VersionStamp.Default, VersionStamp.Default); var listener = new UnsynchronizableContentDocumentProcessedListener(Dispatcher, cache, generatedDocumentPublisher.Object); listener.Initialize(ProjectSnapshotManager); // Act & Assert listener.DocumentProcessed(document); }
internal void AssertHtmlDocumentMatchesBaseline(RazorHtmlDocument htmlDocument) { if (FileName == null) { var message = $"{nameof(AssertHtmlDocumentMatchesBaseline)} should only be called from an integration test ({nameof(FileName)} is null)."; throw new InvalidOperationException(message); } var baselineFileName = Path.ChangeExtension(FileName, ".codegen.html"); if (GenerateBaselines) { var baselineFullPath = Path.Combine(TestProjectRoot, baselineFileName); File.WriteAllText(baselineFullPath, htmlDocument.GeneratedHtml); return; } var htmlFile = TestFile.Create(baselineFileName, GetType().GetTypeInfo().Assembly); if (!htmlFile.Exists()) { throw new XunitException($"The resource {baselineFileName} was not found."); } var baseline = htmlFile.ReadAllText(); // Normalize newlines to match those in the baseline. var actual = htmlDocument.GeneratedHtml.Replace("\r", "").Replace("\n", "\r\n"); Assert.Equal(baseline, actual); }
public void SetOutput_InvokesChangedEvent() { // Arrange var services = TestWorkspace.Create().Services; var hostProject = new HostProject("C:/project.csproj", RazorConfiguration.Default, "project"); var projectState = ProjectState.Create(services, hostProject); var project = new DefaultProjectSnapshot(projectState); var text = SourceText.From("..."); var textAndVersion = TextAndVersion.Create(text, VersionStamp.Default); var hostDocument = new HostDocument("C:/file.cshtml", "C:/file.cshtml"); var documentState = new DocumentState(services, hostDocument, text, VersionStamp.Default, () => Task.FromResult(textAndVersion)); var document = new DefaultDocumentSnapshot(project, documentState); var csharpDocument = RazorCSharpDocument.Create("...", RazorCodeGenerationOptions.CreateDefault(), Enumerable.Empty <RazorDiagnostic>()); var htmlDocument = RazorHtmlDocument.Create("...", RazorCodeGenerationOptions.CreateDefault()); var version = VersionStamp.Create(); var container = new GeneratedDocumentContainer(); var csharpChanged = false; var htmlChanged = false; container.GeneratedCSharpChanged += (o, a) => { csharpChanged = true; }; container.GeneratedHtmlChanged += (o, a) => { htmlChanged = true; }; // Act container.SetOutput(document, csharpDocument, htmlDocument, version, version, version); // Assert Assert.NotNull(container.LatestDocument); Assert.True(csharpChanged); Assert.True(htmlChanged); }
public void SetOutput_AcceptsSameVersionedDocuments() { // Arrange var services = TestWorkspace.Create().Services; var hostProject = new HostProject("C:/project.csproj", RazorConfiguration.Default, "project"); var projectState = ProjectState.Create(services, hostProject); var project = new DefaultProjectSnapshot(projectState); var text = SourceText.From("..."); var textAndVersion = TextAndVersion.Create(text, VersionStamp.Default); var hostDocument = new HostDocument("C:/file.cshtml", "C:/file.cshtml"); var documentState = new DocumentState(services, hostDocument, text, VersionStamp.Default, () => Task.FromResult(textAndVersion)); var document = new DefaultDocumentSnapshot(project, documentState); var newDocument = new DefaultDocumentSnapshot(project, documentState); var csharpDocument = RazorCSharpDocument.Create("...", RazorCodeGenerationOptions.CreateDefault(), Enumerable.Empty <RazorDiagnostic>()); var htmlDocument = RazorHtmlDocument.Create("...", RazorCodeGenerationOptions.CreateDefault()); var version = VersionStamp.Create(); var container = new GeneratedDocumentContainer(); container.SetOutput(document, csharpDocument, htmlDocument, version, version, version); // Act container.SetOutput(newDocument, csharpDocument, htmlDocument, version, version, version); // Assert Assert.Same(newDocument, container.LatestDocument); }
public void SetOutput( DefaultDocumentSnapshot document, RazorCSharpDocument outputCSharp, RazorHtmlDocument outputHtml, VersionStamp inputVersion, VersionStamp outputCSharpVersion, VersionStamp outputHtmlVersion) { lock (_setOutputLock) { if (_inputVersion.HasValue && _inputVersion != inputVersion && _inputVersion == _inputVersion.Value.GetNewerVersion(inputVersion)) { // Latest document is newer than the provided document. return; } if (!document.TryGetText(out var source)) { Debug.Fail("The text should have already been evaluated."); return; } _source = source; _inputVersion = inputVersion; _outputCSharpVersion = outputCSharpVersion; _outputHtmlVersion = outputHtmlVersion; _outputCSharp = outputCSharp; _outputHtml = outputHtml; _latestDocument = document; _csharpTextContainer.SetText(SourceText.From(_outputCSharp.GeneratedCode)); _htmlTextContainer.SetText(SourceText.From(_outputHtml.GeneratedHtml)); } }
public void DocumentProcessed_SynchronizesIfSourceVersionsAreIdenticalButSyncVersionNewer() { // Arrange var lastVersion = VersionStamp.Default.GetNewerVersion(); var lastDocument = TestDocumentSnapshot.Create("C:/path/old.cshtml", lastVersion); var document = TestDocumentSnapshot.Create("C:/path/file.cshtml", lastVersion); var generatedDocumentPublisher = new Mock <GeneratedDocumentPublisher>(MockBehavior.Strict); generatedDocumentPublisher.Setup(publisher => publisher.PublishCSharp(It.IsAny <string>(), It.IsAny <SourceText>(), It.IsAny <int>())) .Callback <string, SourceText, int>((filePath, sourceText, hostDocumentVersion) => { Assert.Equal(document.FilePath, filePath); Assert.Equal(document.State.GeneratedDocumentContainer.CSharpSourceTextContainer.CurrentText.ToString(), sourceText.ToString()); }) .Verifiable(); generatedDocumentPublisher.Setup(publisher => publisher.PublishHtml(It.IsAny <string>(), It.IsAny <SourceText>(), It.IsAny <int>())) .Callback <string, SourceText, int>((filePath, sourceText, hostDocumentVersion) => { Assert.Equal(document.FilePath, filePath); Assert.Equal(document.State.GeneratedDocumentContainer.HtmlSourceTextContainer.CurrentText.ToString(), sourceText.ToString()); }) .Verifiable(); var cache = new TestDocumentVersionCache(new Dictionary <DocumentSnapshot, int?>() { [document] = 1338, [lastDocument] = 1337, }); var csharpDocument = RazorCSharpDocument.Create("Anything", RazorCodeGenerationOptions.CreateDefault(), Enumerable.Empty <RazorDiagnostic>()); var htmlDocument = RazorHtmlDocument.Create("Anything", RazorCodeGenerationOptions.CreateDefault()); var codeDocument = CreateCodeDocument(csharpDocument, htmlDocument); // Force the state to already be up-to-date document.State.HostDocument.GeneratedDocumentContainer.SetOutput(lastDocument, codeDocument, lastVersion, VersionStamp.Default, VersionStamp.Default); var listener = new UnsynchronizableContentDocumentProcessedListener(Dispatcher, cache, generatedDocumentPublisher.Object); listener.Initialize(ProjectSnapshotManager); // Act listener.DocumentProcessed(document); // Assert generatedDocumentPublisher.VerifyAll(); }
public bool TrySetOutput( DefaultDocumentSnapshot document, RazorCodeDocument codeDocument, VersionStamp inputVersion, VersionStamp outputCSharpVersion, VersionStamp outputHtmlVersion) { lock (_setOutputLock) { if (_inputVersion.HasValue && _inputVersion.Value != inputVersion && _inputVersion == _inputVersion.Value.GetNewerVersion(inputVersion)) { // Latest document is newer than the provided document. return(false); } if (!document.TryGetText(out var source)) { Debug.Fail("The text should have already been evaluated."); return(false); } _source = source; _inputVersion = inputVersion; _outputCSharpVersion = outputCSharpVersion; _outputHtmlVersion = outputHtmlVersion; _outputCSharp = codeDocument.GetCSharpDocument(); _outputHtml = codeDocument.GetHtmlDocument(); _latestDocument = document; var csharpSourceText = codeDocument.GetCSharpSourceText(); _csharpTextContainer.SetText(csharpSourceText); var htmlSourceText = codeDocument.GetHtmlSourceText(); _htmlTextContainer.SetText(htmlSourceText); return(true); } }
private static RazorCodeDocument CreateCodeDocument(RazorCSharpDocument csharpDocument, RazorHtmlDocument htmlDocument) { var codeDocument = TestRazorCodeDocument.CreateEmpty(); codeDocument.SetCSharpDocument(csharpDocument); codeDocument.Items[typeof(RazorHtmlDocument)] = htmlDocument; return(codeDocument); }