Beispiel #1
0
    public void WriteDocument_SHA256_WritesChecksumAndMarksAutoGenerated()
    {
        // Arrange
        var checksumBytes = new byte[] { (byte)'t', (byte)'e', (byte)'s', (byte)'t', };

        var sourceDocument = Mock.Of <RazorSourceDocument>(d =>
                                                           d.FilePath == "test.cshtml" &&
                                                           d.GetChecksum() == checksumBytes &&
                                                           d.GetChecksumAlgorithm() == "SHA256");

        var document = new DocumentIntermediateNode();

        var codeDocument = RazorCodeDocument.Create(sourceDocument);
        var options      = RazorCodeGenerationOptions.CreateDefault();

        var target = CodeTarget.CreateDefault(codeDocument, options);
        var writer = new DefaultDocumentWriter(target, options);

        // Act
        var result = writer.WriteDocument(codeDocument, document);

        // Assert
        var csharp = result.GeneratedCode;

        Assert.Equal(
            @"#pragma checksum ""test.cshtml"" ""{8829d00f-11b8-4213-878b-770e8597ac16}"" ""74657374""
// <auto-generated/>
#pragma warning disable 1591
#pragma warning restore 1591
",
            csharp,
            ignoreLineEndingDifferences: true);
    }
Beispiel #2
0
        public void Execute_CollatesIRDocumentDiagnosticsFromSourceDocument()
        {
            // Arrange
            var phase        = new DefaultRazorCSharpLoweringPhase();
            var engine       = RazorEngine.CreateEmpty(b => b.Phases.Add(phase));
            var codeDocument = TestRazorCodeDocument.Create("<p class=@(");
            var options      = RazorCodeGenerationOptions.CreateDefault();
            var irDocument   = new DocumentIntermediateNode()
            {
                DocumentKind = "test",
                Target       = CodeTarget.CreateDefault(codeDocument, options),
                Options      = options,
            };
            var expectedDiagnostic = RazorDiagnostic.Create(
                new RazorDiagnosticDescriptor("1234", () => "I am an error.", RazorDiagnosticSeverity.Error),
                new SourceSpan("SomeFile.cshtml", 11, 0, 11, 1));

            irDocument.Diagnostics.Add(expectedDiagnostic);
            codeDocument.SetDocumentIntermediateNode(irDocument);

            // Act
            phase.Execute(codeDocument);

            // Assert
            var csharpDocument = codeDocument.GetCSharpDocument();
            var diagnostic     = Assert.Single(csharpDocument.Diagnostics);

            Assert.Same(expectedDiagnostic, diagnostic);
        }
Beispiel #3
0
    [Fact] // This test covers the whole process including actual hashing.
    public void WriteDocument_EndToEnd_WritesChecksumAndMarksAutoGenerated()
    {
        // Arrange
        var document = new DocumentIntermediateNode();

        var codeDocument = TestRazorCodeDocument.CreateEmpty();
        var options      = RazorCodeGenerationOptions.CreateDefault();

        var target = CodeTarget.CreateDefault(codeDocument, options);
        var writer = new DefaultDocumentWriter(target, options);

        // Act
        var result = writer.WriteDocument(codeDocument, document);

        // Assert
        var csharp = result.GeneratedCode;

        Assert.Equal(
            @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
#pragma warning disable 1591
#pragma warning restore 1591
",
            csharp,
            ignoreLineEndingDifferences: true);
    }
Beispiel #4
0
    public void WriteDocument_Empty_SuppressChecksumTrue_DoesnotWriteChecksum()
    {
        // Arrange
        var document = new DocumentIntermediateNode();

        var codeDocument   = TestRazorCodeDocument.CreateEmpty();
        var optionsBuilder = new DefaultRazorCodeGenerationOptionsBuilder(designTime: false)
        {
            SuppressChecksum = true
        };
        var options = optionsBuilder.Build();

        var target = CodeTarget.CreateDefault(codeDocument, options);
        var writer = new DefaultDocumentWriter(target, options);

        // Act
        var result = writer.WriteDocument(codeDocument, document);

        // Assert
        var csharp = result.GeneratedCode;

        Assert.Equal(
            @"// <auto-generated/>
#pragma warning disable 1591
#pragma warning restore 1591
",
            csharp,
            ignoreLineEndingDifferences: true);
    }
Beispiel #5
0
    public void WriteDocument_UnsupportedChecksumAlgorithm_Throws()
    {
        // Arrange
        var checksumBytes = new byte[] { (byte)'t', (byte)'e', (byte)'s', (byte)'t', };

        var sourceDocument = Mock.Of <RazorSourceDocument>(d =>
                                                           d.FilePath == "test.cshtml" &&
                                                           d.GetChecksum() == checksumBytes &&
                                                           d.GetChecksumAlgorithm() == "SHA3");

        var document = new DocumentIntermediateNode();

        var codeDocument = RazorCodeDocument.Create(sourceDocument);
        var options      = RazorCodeGenerationOptions.CreateDefault();

        var target = CodeTarget.CreateDefault(codeDocument, options);
        var writer = new DefaultDocumentWriter(target, options);

        // Act & Assert
        var exception = Assert.Throws <InvalidOperationException>(() =>
        {
            var result = writer.WriteDocument(codeDocument, document);
        });

        Assert.Equal(
            "The hash algorithm 'SHA3' is not supported for checksum generation. Supported algorithms are: 'SHA1 SHA256'. " +
            "Set 'RazorCodeGenerationOptions.SuppressChecksum' to 'True' to suppress automatic checksum generation.",
            exception.Message);
    }
Beispiel #6
0
    public void WriteDocument_WritesClass_ConstrainedGenericTypeParameters()
    {
        // Arrange
        var document = new DocumentIntermediateNode();
        var builder  = IntermediateNodeBuilder.Create(document);

        builder.Add(new ClassDeclarationIntermediateNode()
        {
            Modifiers =
            {
                "internal"
            },
            BaseType   = "TestBase",
            Interfaces = new List <string> {
                "IFoo", "IBar",
            },
            TypeParameters = new List <TypeParameter>
            {
                new TypeParameter()
                {
                    ParameterName = "TKey", Constraints = "where TKey : class"
                },
                new TypeParameter()
                {
                    ParameterName = "TValue", Constraints = "where TValue : class"
                },
            },
            ClassName = "TestClass",
        });

        var codeDocument = TestRazorCodeDocument.CreateEmpty();
        var options      = RazorCodeGenerationOptions.CreateDefault();

        var target = CodeTarget.CreateDefault(codeDocument, options);
        var writer = new DefaultDocumentWriter(target, options);

        // Act
        var result = writer.WriteDocument(codeDocument, document);

        // Assert
        var csharp = result.GeneratedCode;

        Assert.Equal(
            @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
#pragma warning disable 1591
internal class TestClass<TKey, TValue> : TestBase, IFoo, IBar
where TKey : class
where TValue : class
{
}
#pragma warning restore 1591
",
            csharp,
            ignoreLineEndingDifferences: true);
    }
Beispiel #7
0
    public void CreateEmpty_AllowsNullDelegate()
    {
        // Arrange
        var codeDocument = TestRazorCodeDocument.CreateEmpty();
        var options      = RazorCodeGenerationOptions.CreateDefault();

        // Act
        CodeTarget.CreateDefault(codeDocument, options, configure: null);

        // Assert (does not throw)
    }
Beispiel #8
0
    // virtual to allow replacing the code target wholesale.
    protected virtual CodeTarget CreateTarget(RazorCodeDocument codeDocument, RazorCodeGenerationOptions options)
    {
        return(CodeTarget.CreateDefault(codeDocument, options, (builder) =>
        {
            for (var i = 0; i < TargetExtensions.Count; i++)
            {
                builder.TargetExtensions.Add(TargetExtensions[i]);
            }

            ConfigureTarget(builder);
        }));
    }
Beispiel #9
0
        private CodeTarget CreateTarget(RazorCodeDocument codeDocument, RazorCodeGenerationOptions options)
        {
            return(CodeTarget.CreateDefault(codeDocument, options, (builder) =>
            {
                for (var i = 0; i < _targetExtensions.Length; i++)
                {
                    builder.TargetExtensions.Add(_targetExtensions[i]);
                }

                ConfigureTarget(builder);
            }));
        }
Beispiel #10
0
    public void CreateDefault_CreatesDefaultCodeTarget()
    {
        // Arrange
        var codeDocument = TestRazorCodeDocument.CreateEmpty();
        var options      = RazorCodeGenerationOptions.CreateDefault();

        // Act
        var target = CodeTarget.CreateDefault(codeDocument, options);

        // Assert
        Assert.IsType <DefaultCodeTarget>(target);
    }
Beispiel #11
0
    public void CreateDefault_CallsDelegate()
    {
        // Arrange
        var wasCalled = false;
        Action <CodeTargetBuilder> @delegate = (b) => { wasCalled = true; };

        var codeDocument = TestRazorCodeDocument.CreateEmpty();
        var options      = RazorCodeGenerationOptions.CreateDefault();

        // Act
        CodeTarget.CreateDefault(codeDocument, options, @delegate);

        // Assert
        Assert.True(wasCalled);
    }
Beispiel #12
0
    public void WriteDocument_WritesProperty()
    {
        // Arrange
        var document = new DocumentIntermediateNode();
        var builder  = IntermediateNodeBuilder.Create(document);

        builder.Add(new PropertyDeclarationIntermediateNode()
        {
            Modifiers =
            {
                "internal",
                "virtual",
            },
            PropertyName = "Foo",
            PropertyType = "string",
        });

        var codeDocument = TestRazorCodeDocument.CreateEmpty();
        var options      = RazorCodeGenerationOptions.CreateDefault();

        var target = CodeTarget.CreateDefault(codeDocument, options);
        var writer = new DefaultDocumentWriter(target, options);

        // Act
        var result = writer.WriteDocument(codeDocument, document);

        // Assert
        var csharp = result.GeneratedCode;

        Assert.Equal(
            @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
#pragma warning disable 1591
internal virtual string Foo { get; set; }
#pragma warning restore 1591
",
            csharp,
            ignoreLineEndingDifferences: true);
    }
Beispiel #13
0
    public void WriteDocument_WritesNamespace()
    {
        // Arrange
        var document = new DocumentIntermediateNode();
        var builder  = IntermediateNodeBuilder.Create(document);

        builder.Add(new NamespaceDeclarationIntermediateNode()
        {
            Content = "TestNamespace",
        });

        var codeDocument = TestRazorCodeDocument.CreateEmpty();
        var options      = RazorCodeGenerationOptions.CreateDefault();

        var target = CodeTarget.CreateDefault(codeDocument, options);
        var writer = new DefaultDocumentWriter(target, options);

        // Act
        var result = writer.WriteDocument(codeDocument, document);

        // Assert
        var csharp = result.GeneratedCode;

        Assert.Equal(
            @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
#pragma warning disable 1591
namespace TestNamespace
{
    #line hidden
}
#pragma warning restore 1591
",
            csharp,
            ignoreLineEndingDifferences: true);
    }
Beispiel #14
0
    public void WriteDocument_WritesMethod()
    {
        // Arrange
        var document = new DocumentIntermediateNode();
        var builder  = IntermediateNodeBuilder.Create(document);

        builder.Add(new MethodDeclarationIntermediateNode()
        {
            Modifiers =
            {
                "internal",
                "virtual",
                "async",
            },
            MethodName = "TestMethod",
            Parameters =
            {
                new MethodParameter()
                {
                    Modifiers =
                    {
                        "readonly",
                        "ref",
                    },
                    ParameterName = "a",
                    TypeName      = "int",
                },
                new MethodParameter()
                {
                    ParameterName = "b",
                    TypeName      = "string",
                }
            },
            ReturnType = "string",
        });

        var codeDocument = TestRazorCodeDocument.CreateEmpty();
        var options      = RazorCodeGenerationOptions.CreateDefault();

        var target = CodeTarget.CreateDefault(codeDocument, options);
        var writer = new DefaultDocumentWriter(target, options);

        // Act
        var result = writer.WriteDocument(codeDocument, document);

        // Assert
        var csharp = result.GeneratedCode;

        Assert.Equal(
            @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
#pragma warning disable 1591
#pragma warning disable 1998
internal virtual async string TestMethod(readonly ref int a, string b)
{
}
#pragma warning restore 1998
#pragma warning restore 1591
",
            csharp,
            ignoreLineEndingDifferences: true);
    }