Add Razor Evolution Engine and primitives
This commit is contained in:
parent
43caef488c
commit
6b9b75841f
|
|
@ -0,0 +1,43 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
internal class DefaultItemCollection : ItemCollection
|
||||||
|
{
|
||||||
|
private readonly Dictionary<object, object> _items;
|
||||||
|
|
||||||
|
public DefaultItemCollection()
|
||||||
|
{
|
||||||
|
_items = new Dictionary<object, object>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object this[object key]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (key == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
object value;
|
||||||
|
_items.TryGetValue(key, out value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (key == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
_items[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
internal class DefaultRazorCodeDocument : RazorCodeDocument
|
||||||
|
{
|
||||||
|
public DefaultRazorCodeDocument(RazorSourceDocument source)
|
||||||
|
{
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(source));
|
||||||
|
}
|
||||||
|
|
||||||
|
Source = source;
|
||||||
|
|
||||||
|
Items = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override ItemCollection Items { get; }
|
||||||
|
|
||||||
|
public override RazorSourceDocument Source { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
internal class DefaultRazorEngine : RazorEngine
|
||||||
|
{
|
||||||
|
public DefaultRazorEngine(IRazorEngineFeature[] features, IRazorEnginePhase[] phases)
|
||||||
|
{
|
||||||
|
if (features == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(features));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (phases == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(phases));
|
||||||
|
}
|
||||||
|
|
||||||
|
Features = features;
|
||||||
|
Phases = phases;
|
||||||
|
|
||||||
|
for (var i = 0; i < features.Length; i++)
|
||||||
|
{
|
||||||
|
features[i].Engine = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < phases.Length; i++)
|
||||||
|
{
|
||||||
|
phases[i].Engine = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IReadOnlyList<IRazorEngineFeature> Features { get; }
|
||||||
|
|
||||||
|
public override IReadOnlyList<IRazorEnginePhase> Phases { get; }
|
||||||
|
|
||||||
|
public override void Process(RazorCodeDocument document)
|
||||||
|
{
|
||||||
|
if (document == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(document));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < Phases.Count; i++)
|
||||||
|
{
|
||||||
|
var phase = Phases[i];
|
||||||
|
phase.Execute(document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
internal class DefaultRazorEngineBuilder : IRazorEngineBuilder
|
||||||
|
{
|
||||||
|
public DefaultRazorEngineBuilder()
|
||||||
|
{
|
||||||
|
Features = new List<IRazorEngineFeature>();
|
||||||
|
Phases = new List<IRazorEnginePhase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICollection<IRazorEngineFeature> Features { get; }
|
||||||
|
|
||||||
|
public IList<IRazorEnginePhase> Phases { get; }
|
||||||
|
|
||||||
|
public RazorEngine Build()
|
||||||
|
{
|
||||||
|
var features = new IRazorEngineFeature[Features.Count];
|
||||||
|
Features.CopyTo(features, arrayIndex: 0);
|
||||||
|
|
||||||
|
var phases = new IRazorEnginePhase[Phases.Count];
|
||||||
|
Phases.CopyTo(phases, arrayIndex: 0);
|
||||||
|
|
||||||
|
return new DefaultRazorEngine(features, phases);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
internal class DefaultRazorSourceDocument : RazorSourceDocument
|
||||||
|
{
|
||||||
|
private MemoryStream _stream;
|
||||||
|
|
||||||
|
public DefaultRazorSourceDocument(MemoryStream stream, Encoding encoding, string filename)
|
||||||
|
{
|
||||||
|
if (stream == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(stream));
|
||||||
|
}
|
||||||
|
|
||||||
|
_stream = stream;
|
||||||
|
Encoding = encoding;
|
||||||
|
Filename = filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Encoding Encoding { get; }
|
||||||
|
|
||||||
|
public override string Filename { get; }
|
||||||
|
|
||||||
|
public override TextReader CreateReader()
|
||||||
|
{
|
||||||
|
var copy = new MemoryStream(_stream.ToArray());
|
||||||
|
|
||||||
|
return Encoding == null
|
||||||
|
? new StreamReader(copy, detectEncodingFromByteOrderMarks: true)
|
||||||
|
: new StreamReader(copy, Encoding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public interface IRazorEngineBuilder
|
||||||
|
{
|
||||||
|
ICollection<IRazorEngineFeature> Features { get; }
|
||||||
|
|
||||||
|
IList<IRazorEnginePhase> Phases { get; }
|
||||||
|
|
||||||
|
RazorEngine Build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public interface IRazorEngineFeature
|
||||||
|
{
|
||||||
|
RazorEngine Engine { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public interface IRazorEnginePhase
|
||||||
|
{
|
||||||
|
RazorEngine Engine { get; set; }
|
||||||
|
|
||||||
|
void Execute(RazorCodeDocument document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public abstract class ItemCollection
|
||||||
|
{
|
||||||
|
public abstract object this[object key] { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public abstract class RazorCodeDocument
|
||||||
|
{
|
||||||
|
public static RazorCodeDocument Create(RazorSourceDocument source)
|
||||||
|
{
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(source));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new DefaultRazorCodeDocument(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract ItemCollection Items { get; }
|
||||||
|
|
||||||
|
public abstract RazorSourceDocument Source { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public abstract class RazorEngine
|
||||||
|
{
|
||||||
|
public static RazorEngine Create()
|
||||||
|
{
|
||||||
|
return Create(configure: null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RazorEngine Create(Action<IRazorEngineBuilder> configure)
|
||||||
|
{
|
||||||
|
var builder = new DefaultRazorEngineBuilder();
|
||||||
|
configure?.Invoke(builder);
|
||||||
|
return builder.Build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract IReadOnlyList<IRazorEngineFeature> Features { get; }
|
||||||
|
|
||||||
|
public abstract IReadOnlyList<IRazorEnginePhase> Phases { get; }
|
||||||
|
|
||||||
|
public abstract void Process(RazorCodeDocument document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public abstract class RazorSourceDocument
|
||||||
|
{
|
||||||
|
public static RazorSourceDocument ReadFrom(Stream stream, string filename)
|
||||||
|
{
|
||||||
|
if (stream == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(stream));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ReadFromInternal(stream, filename, encoding: null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RazorSourceDocument ReadFrom(Stream stream, string filename, Encoding encoding)
|
||||||
|
{
|
||||||
|
if (stream == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(stream));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (encoding == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(encoding));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ReadFromInternal(stream, filename, encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RazorSourceDocument ReadFromInternal(Stream stream, string filename, Encoding encoding)
|
||||||
|
{
|
||||||
|
var memoryStream = new MemoryStream();
|
||||||
|
stream.CopyTo(memoryStream);
|
||||||
|
|
||||||
|
return new DefaultRazorSourceDocument(memoryStream, encoding, filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract string Filename { get; }
|
||||||
|
|
||||||
|
public abstract TextReader CreateReader();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public class DefaultItemCollectionTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Get_MissingValueReturnsNull()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var items = new DefaultItemCollection();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var value = items["foo"];
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Null(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetAndSet_ReturnsValue()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var items = new DefaultItemCollection();
|
||||||
|
|
||||||
|
var expected = "bar";
|
||||||
|
items["foo"] = expected;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var value = items["foo"];
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Same(expected, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Set_CanSetValueToNull()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var items = new DefaultItemCollection();
|
||||||
|
|
||||||
|
items["foo"] = "bar";
|
||||||
|
|
||||||
|
// Act
|
||||||
|
items["foo"] = null;
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Null(items["foo"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public class DefaultRazorCodeDocumentTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Ctor()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var source = TestRazorSourceDocument.Create();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var code = new DefaultRazorCodeDocument(source);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Same(source, code.Source);
|
||||||
|
Assert.NotNull(code.Items);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
using Moq;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public class DefaultRazorEngineBuilderTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Build_AddsFeaturesAndPhases()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var builder = new DefaultRazorEngineBuilder();
|
||||||
|
|
||||||
|
builder.Features.Add(Mock.Of<IRazorEngineFeature>());
|
||||||
|
builder.Features.Add(Mock.Of<IRazorEngineFeature>());
|
||||||
|
|
||||||
|
builder.Phases.Add(Mock.Of<IRazorEnginePhase>());
|
||||||
|
builder.Phases.Add(Mock.Of<IRazorEnginePhase>());
|
||||||
|
|
||||||
|
var features = builder.Features.ToArray();
|
||||||
|
var phases = builder.Phases.ToArray();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var engine = builder.Build();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Collection(
|
||||||
|
engine.Features,
|
||||||
|
f => Assert.Same(features[0], f),
|
||||||
|
f => Assert.Same(features[1], f));
|
||||||
|
|
||||||
|
Assert.Collection(
|
||||||
|
engine.Phases,
|
||||||
|
p => Assert.Same(phases[0], p),
|
||||||
|
p => Assert.Same(phases[1], p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Moq;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public class DefaultRazorEngineTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Ctor_InitializesPhasesAndFeatures()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var features = new IRazorEngineFeature[]
|
||||||
|
{
|
||||||
|
Mock.Of<IRazorEngineFeature>(),
|
||||||
|
Mock.Of<IRazorEngineFeature>(),
|
||||||
|
};
|
||||||
|
|
||||||
|
var phases = new IRazorEnginePhase[]
|
||||||
|
{
|
||||||
|
Mock.Of<IRazorEnginePhase>(),
|
||||||
|
Mock.Of<IRazorEnginePhase>(),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var engine = new DefaultRazorEngine(features, phases);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
for (var i = 0; i < features.Length; i++)
|
||||||
|
{
|
||||||
|
Assert.Same(engine, features[i].Engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < phases.Length; i++)
|
||||||
|
{
|
||||||
|
Assert.Same(engine, phases[i].Engine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Process_CallsAllPhases()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var features = new IRazorEngineFeature[]
|
||||||
|
{
|
||||||
|
Mock.Of<IRazorEngineFeature>(),
|
||||||
|
Mock.Of<IRazorEngineFeature>(),
|
||||||
|
};
|
||||||
|
|
||||||
|
var phases = new IRazorEnginePhase[]
|
||||||
|
{
|
||||||
|
Mock.Of<IRazorEnginePhase>(),
|
||||||
|
Mock.Of<IRazorEnginePhase>(),
|
||||||
|
};
|
||||||
|
|
||||||
|
var engine = new DefaultRazorEngine(features, phases);
|
||||||
|
var document = TestRazorCodeDocument.CreateEmpty();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
engine.Process(document);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
for (var i = 0; i < phases.Length; i++)
|
||||||
|
{
|
||||||
|
var mock = Mock.Get(phases[i]);
|
||||||
|
mock.Verify(p => p.Execute(document), Times.Once());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public class DefaultRazorSourceDocumentTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Filename()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var content = CreateContent();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var document = new DefaultRazorSourceDocument(content, Encoding.UTF8, filename: "file.cshtml");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("file.cshtml", document.Filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Filename_Null()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var content = CreateContent();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var document = new DefaultRazorSourceDocument(content, Encoding.UTF8, filename: null);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Null(document.Filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CreateReader_WithEncoding()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var content = CreateContent("Hi", encoding: Encoding.UTF8);
|
||||||
|
var document = new DefaultRazorSourceDocument(content, Encoding.UTF8, filename: null);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
using (var reader = document.CreateReader())
|
||||||
|
{
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("Hi", reader.ReadToEnd());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CreateReader_Null_DetectsEncoding()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var content = CreateContent("Hi", encoding: Encoding.UTF32);
|
||||||
|
var document = new DefaultRazorSourceDocument(content, encoding: null, filename: null);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
using (var reader = document.CreateReader())
|
||||||
|
{
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("Hi", reader.ReadToEnd());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CreateReader_DisposeReader_DoesNotDirtyDocument()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var content = CreateContent("Hi", encoding: Encoding.UTF32);
|
||||||
|
var document = new DefaultRazorSourceDocument(content, encoding: null, filename: null);
|
||||||
|
|
||||||
|
// Act & Assert
|
||||||
|
//
|
||||||
|
// (we should be able to do this twice to prove that the underlying data isn't disposed)
|
||||||
|
for (var i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
using (var reader = document.CreateReader())
|
||||||
|
{
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("Hi", reader.ReadToEnd());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MemoryStream CreateContent(string content = "Hello, World!", Encoding encoding = null)
|
||||||
|
{
|
||||||
|
var stream = new MemoryStream();
|
||||||
|
using (var writer = new StreamWriter(stream, encoding ?? Encoding.UTF8, bufferSize: 1024, leaveOpen: true))
|
||||||
|
{
|
||||||
|
writer.Write(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public class IntegrationTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void BuildEngine_CallProcess()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var engine = RazorEngine.Create();
|
||||||
|
|
||||||
|
var document = RazorCodeDocument.Create(TestRazorSourceDocument.Create());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
engine.Process(document);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
// (nothing to verify yet)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public class RazorCodeDocumentTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Create()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var source = TestRazorSourceDocument.Create();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var code = RazorCodeDocument.Create(source);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Same(source, code.Source);
|
||||||
|
Assert.NotNull(code.Items);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
using Moq;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public class RazorEngineTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Create_NoArg_CreatesDefaultEngine()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
// Act
|
||||||
|
var engine = RazorEngine.Create();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.IsType<DefaultRazorEngine>(engine);
|
||||||
|
Assert.Empty(engine.Features);
|
||||||
|
Assert.Empty(engine.Phases);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Create_Null_CreatesDefaultEngine()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
// Act
|
||||||
|
var engine = RazorEngine.Create(configure: null);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.IsType<DefaultRazorEngine>(engine);
|
||||||
|
Assert.Empty(engine.Features);
|
||||||
|
Assert.Empty(engine.Phases);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Create_Lambda_AddsFeaturesAndPhases()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
IRazorEngineFeature[] features = null;
|
||||||
|
IRazorEnginePhase[] phases = null;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var engine = RazorEngine.Create(builder =>
|
||||||
|
{
|
||||||
|
builder.Features.Add(Mock.Of<IRazorEngineFeature>());
|
||||||
|
builder.Features.Add(Mock.Of<IRazorEngineFeature>());
|
||||||
|
|
||||||
|
builder.Phases.Add(Mock.Of<IRazorEnginePhase>());
|
||||||
|
builder.Phases.Add(Mock.Of<IRazorEnginePhase>());
|
||||||
|
|
||||||
|
features = builder.Features.ToArray();
|
||||||
|
phases = builder.Phases.ToArray();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Collection(
|
||||||
|
engine.Features,
|
||||||
|
f => Assert.Same(features[0], f),
|
||||||
|
f => Assert.Same(features[1], f));
|
||||||
|
|
||||||
|
Assert.Collection(
|
||||||
|
engine.Phases,
|
||||||
|
p => Assert.Same(phases[0], p),
|
||||||
|
p => Assert.Same(phases[1], p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Text;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
public class RazorSourceDocumentTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Create()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var content = TestRazorSourceDocument.CreateContent();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var document = RazorSourceDocument.ReadFrom(content, "file.cshtml");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("file.cshtml", document.Filename);
|
||||||
|
Assert.Null(Assert.IsType<DefaultRazorSourceDocument>(document).Encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Create_WithEncoding()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var content = TestRazorSourceDocument.CreateContent(encoding: Encoding.UTF32);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var document = RazorSourceDocument.ReadFrom(content, "file.cshtml", Encoding.UTF32);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("file.cshtml", document.Filename);
|
||||||
|
Assert.Same(Encoding.UTF32, Assert.IsType<DefaultRazorSourceDocument>(document).Encoding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
internal class TestRazorCodeDocument : DefaultRazorCodeDocument
|
||||||
|
{
|
||||||
|
public static TestRazorCodeDocument CreateEmpty()
|
||||||
|
{
|
||||||
|
var source = TestRazorSourceDocument.Create(content: string.Empty);
|
||||||
|
return new TestRazorCodeDocument(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
private TestRazorCodeDocument(RazorSourceDocument source)
|
||||||
|
: base(source)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Evolution
|
||||||
|
{
|
||||||
|
internal class TestRazorSourceDocument : DefaultRazorSourceDocument
|
||||||
|
{
|
||||||
|
public static MemoryStream CreateContent(string content = "Hello, World!", Encoding encoding = null)
|
||||||
|
{
|
||||||
|
var stream = new MemoryStream();
|
||||||
|
using (var writer = new StreamWriter(stream, encoding ?? Encoding.UTF8, bufferSize: 1024, leaveOpen: true))
|
||||||
|
{
|
||||||
|
writer.Write(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.Seek(0L, SeekOrigin.Begin);
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RazorSourceDocument Create(string content = "Hello, world!", Encoding encoding = null)
|
||||||
|
{
|
||||||
|
var stream = CreateContent(content, encoding);
|
||||||
|
return new TestRazorSourceDocument(stream, encoding ?? Encoding.UTF8, "test.cshtml");
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestRazorSourceDocument(MemoryStream stream, Encoding encoding, string filename)
|
||||||
|
: base(stream, encoding, filename)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dotnet-test-xunit": "2.2.0-*",
|
"dotnet-test-xunit": "2.2.0-*",
|
||||||
"Microsoft.AspNetCore.Razor.Evolution": "1.1.0-*",
|
"Microsoft.AspNetCore.Razor.Evolution": "1.1.0-*",
|
||||||
|
"Moq": "4.6.36-*",
|
||||||
"xunit": "2.2.0-*"
|
"xunit": "2.2.0-*"
|
||||||
},
|
},
|
||||||
"testRunner": "xunit",
|
"testRunner": "xunit",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue