parent
b240929cf4
commit
48ab68bd2a
|
|
@ -1,15 +1,27 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 14
|
# Visual Studio 15
|
||||||
VisualStudioVersion = 14.0.23107.0
|
VisualStudioVersion = 15.0.26123.0
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{430B59ED-F960-4D3A-8FFE-3370008E168D}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{430B59ED-F960-4D3A-8FFE-3370008E168D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{36CD6341-AB44-44EB-B3AA-BF98C89FECDD}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{36CD6341-AB44-44EB-B3AA-BF98C89FECDD}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.JsonPatch", "src\Microsoft.AspNetCore.JsonPatch\Microsoft.AspNetCore.JsonPatch.xproj", "{4D55F4D8-633B-462F-A5B1-FEB84BD2D534}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.JsonPatch", "src\Microsoft.AspNetCore.JsonPatch\Microsoft.AspNetCore.JsonPatch.csproj", "{4D55F4D8-633B-462F-A5B1-FEB84BD2D534}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.JsonPatch.Test", "test\Microsoft.AspNetCore.JsonPatch.Test\Microsoft.AspNetCore.JsonPatch.Test.xproj", "{81C20848-E063-4E12-AC40-0B55A532C16C}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.JsonPatch.Test", "test\Microsoft.AspNetCore.JsonPatch.Test\Microsoft.AspNetCore.JsonPatch.Test.csproj", "{81C20848-E063-4E12-AC40-0B55A532C16C}"
|
||||||
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C430C499-382D-47BD-B351-CF8F89C08CD2}"
|
||||||
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
NuGet.config = NuGet.config
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{6DC6B416-C8C4-4BFA-8C1E-A55A6D7EFD08}"
|
||||||
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
build\common.props = build\common.props
|
||||||
|
build\Key.snk = build\Key.snk
|
||||||
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
<configuration>
|
<configuration>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json" />
|
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json" />
|
||||||
|
<add key="AspNetCoreTools" value="https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json" />
|
||||||
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
||||||
</packageSources>
|
</packageSources>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,5 @@ build_script:
|
||||||
clone_depth: 1
|
clone_depth: 1
|
||||||
test: off
|
test: off
|
||||||
deploy: off
|
deploy: off
|
||||||
|
# Required for dotnet-test to work
|
||||||
|
os: Visual Studio 2015
|
||||||
|
|
@ -33,7 +33,7 @@ cd $PSScriptRoot
|
||||||
$repoFolder = $PSScriptRoot
|
$repoFolder = $PSScriptRoot
|
||||||
$env:REPO_FOLDER = $repoFolder
|
$env:REPO_FOLDER = $repoFolder
|
||||||
|
|
||||||
$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip"
|
$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/feature/msbuild.zip"
|
||||||
if ($env:KOREBUILD_ZIP)
|
if ($env:KOREBUILD_ZIP)
|
||||||
{
|
{
|
||||||
$koreBuildZip=$env:KOREBUILD_ZIP
|
$koreBuildZip=$env:KOREBUILD_ZIP
|
||||||
|
|
|
||||||
2
build.sh
2
build.sh
|
|
@ -2,7 +2,7 @@
|
||||||
repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
cd $repoFolder
|
cd $repoFolder
|
||||||
|
|
||||||
koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip"
|
koreBuildZip="https://github.com/aspnet/KoreBuild/archive/feature/msbuild.zip"
|
||||||
if [ ! -z $KOREBUILD_ZIP ]; then
|
if [ ! -z $KOREBUILD_ZIP ]; then
|
||||||
koreBuildZip=$KOREBUILD_ZIP
|
koreBuildZip=$KOREBUILD_ZIP
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,25 @@
|
||||||
|
<Project ToolsVersion="15.0">
|
||||||
|
|
||||||
|
<Import Project="..\version.props" />
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<Product>Microsoft ASP.NET Core</Product>
|
||||||
|
<RepositoryUrl>https://github.com/aspnet/JsonPatch</RepositoryUrl>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)Key.snk</AssemblyOriginatorKeyFile>
|
||||||
|
<SignAssembly>true</SignAssembly>
|
||||||
|
<PublicSign Condition="'$(OS)' != 'Windows_NT'">true</PublicSign>
|
||||||
|
<NetCoreAppImplicitPackageVersion>1.2.0-*</NetCoreAppImplicitPackageVersion>
|
||||||
|
<NetStandardImplicitPackageVersion>1.6.2-*</NetStandardImplicitPackageVersion>
|
||||||
|
<VersionSuffix Condition="'$(VersionSuffix)'!='' AND '$(BuildNumber)' != ''">$(VersionSuffix)-$(BuildNumber)</VersionSuffix>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Internal.AspNetCore.Sdk" Version="1.0.1-*" PrivateAssets="All" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(TargetFrameworkIdentifier)'=='.NETFramework' AND '$(OutputType)'=='library'">
|
||||||
|
<PackageReference Include="NETStandard.Library" Version="$(NetStandardImplicitPackageVersion)" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
10
global.json
10
global.json
|
|
@ -1,10 +0,0 @@
|
||||||
{
|
|
||||||
"projects": [
|
|
||||||
"src",
|
|
||||||
"test/WebSites",
|
|
||||||
"samples"
|
|
||||||
],
|
|
||||||
"sdk": {
|
|
||||||
"version": "1.0.0-preview2-1-003180"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<Import Project="..\..\build\common.props" />
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<Description>ASP.NET Core support for JSON PATCH.</Description>
|
||||||
|
<TargetFrameworks>net451;netstandard1.3</TargetFrameworks>
|
||||||
|
<NoWarn>$(NoWarn);CS1591</NoWarn>
|
||||||
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
|
<PackageTags>aspnetcore;json;jsonpatch</PackageTags>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.ClosedGenericMatcher.Sources" Version="1.2.0-*" PrivateAssets="All" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
|
||||||
|
<PackageReference Include="Microsoft.CSharp" Version="4.4.0-*" />
|
||||||
|
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.4.0-*" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
|
||||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>4d55f4d8-633b-462f-a5b1-feb84bd2d534</ProjectGuid>
|
|
||||||
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
|
|
||||||
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<SchemaVersion>2.0</SchemaVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
|
||||||
</Project>
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
// 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.Reflection;
|
|
||||||
using System.Resources;
|
|
||||||
|
|
||||||
[assembly: AssemblyMetadata("Serviceable", "True")]
|
|
||||||
[assembly: NeutralResourcesLanguage("en-us")]
|
|
||||||
[assembly: AssemblyCompany("Microsoft Corporation.")]
|
|
||||||
[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
|
|
||||||
[assembly: AssemblyProduct("Microsoft ASP.NET Core")]
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
{
|
|
||||||
"version": "1.2.0-*",
|
|
||||||
"description": "ASP.NET Core support for JSON PATCH.",
|
|
||||||
"buildOptions": {
|
|
||||||
"warningsAsErrors": true,
|
|
||||||
"keyFile": "../../tools/Key.snk",
|
|
||||||
"nowarn": [
|
|
||||||
"CS1591"
|
|
||||||
],
|
|
||||||
"xmlDoc": true
|
|
||||||
},
|
|
||||||
"packOptions": {
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/aspnet/jsonpatch"
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"aspnetcore",
|
|
||||||
"json",
|
|
||||||
"jsonpatch"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"NETStandard.Library": "1.6.2-*",
|
|
||||||
"Newtonsoft.Json": "9.0.1",
|
|
||||||
"Microsoft.Extensions.ClosedGenericMatcher.Sources": {
|
|
||||||
"type": "build",
|
|
||||||
"version": "1.2.0-*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net451": {},
|
|
||||||
"netstandard1.3": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.CSharp": "4.4.0-*",
|
|
||||||
"System.Reflection.TypeExtensions": "4.4.0-*"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<Import Project="..\..\build\common.props" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>netcoreapp1.1;net451</TargetFrameworks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.JsonPatch\Microsoft.AspNetCore.JsonPatch.csproj" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Testing" Version="1.2.0-*" />
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-*" />
|
||||||
|
<PackageReference Include="Moq" Version="4.6.36-*" />
|
||||||
|
<PackageReference Include="xunit" Version="2.2.0-*" />
|
||||||
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-*" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp1.1' ">
|
||||||
|
<PackageReference Include="System.Diagnostics.TraceSource" Version="4.4.0-*" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
|
||||||
|
<Reference Include="System.Linq.Expressions" />
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
|
||||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>81c20848-e063-4e12-ac40-0b55a532c16c</ProjectGuid>
|
|
||||||
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
|
|
||||||
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<SchemaVersion>2.0</SchemaVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
|
||||||
</Project>
|
|
||||||
|
|
@ -1,119 +0,0 @@
|
||||||
using System.Collections.Generic;
|
|
||||||
using Newtonsoft.Json.Serialization;
|
|
||||||
using Xunit;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.JsonPatch.Internal
|
|
||||||
{
|
|
||||||
public class ObjectVisitorTest
|
|
||||||
{
|
|
||||||
private class Class1
|
|
||||||
{
|
|
||||||
public IList<string> States { get; set; } = new List<string>();
|
|
||||||
public IDictionary<string, string> Countries = new Dictionary<string, string>();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void Visit_ValidPathToArray_ReturnsListAdapter()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath("/States/-"), new DefaultContractResolver());
|
|
||||||
var model = new Class1();
|
|
||||||
object targetObject = model;
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.True(visitStatus);
|
|
||||||
Assert.True(string.IsNullOrEmpty(message), "Expected no error message");
|
|
||||||
Assert.Same(model.States, targetObject);
|
|
||||||
Assert.IsType<ListAdapter>(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void Visit_ValidPathToDictionary_ReturnsDictionaryAdapter()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath("/Countries/USA"), new DefaultContractResolver());
|
|
||||||
var model = new Class1();
|
|
||||||
object targetObject = model;
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.True(visitStatus);
|
|
||||||
Assert.True(string.IsNullOrEmpty(message), "Expected no error message");
|
|
||||||
Assert.Same(model.Countries, targetObject);
|
|
||||||
Assert.IsType<ListAdapter>(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class AutomobileDepartment
|
|
||||||
{
|
|
||||||
public List<Class1> Customers { get; set; } = new List<Class1>();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void Visit_ValidPathToArray_ReturnsListAdapter_ForDeepNestedPath()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath("/Customers/0/States/-"), new DefaultContractResolver());
|
|
||||||
var customer = new Class1();
|
|
||||||
var automobileDepartment = new AutomobileDepartment();
|
|
||||||
automobileDepartment.Customers.Add(customer);
|
|
||||||
object targetObject = automobileDepartment;
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.True(visitStatus);
|
|
||||||
Assert.True(string.IsNullOrEmpty(message), "Expected no error message");
|
|
||||||
Assert.Same(customer.States, targetObject);
|
|
||||||
Assert.IsType<ListAdapter>(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void Visit_InvalidPathToArray_Fails()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var invalidIndex = 2;
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath($"/Customers/{invalidIndex}/States/-"), new DefaultContractResolver());
|
|
||||||
var automobileDepartment = new AutomobileDepartment();
|
|
||||||
object targetObject = automobileDepartment;
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.False(visitStatus);
|
|
||||||
Assert.Equal(string.Format(ErrorMessageFormats.IndexOutOfBounds, invalidIndex), message);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void Visit_DoesNotValidate_FinalPathSegment()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath($"/NonExisting"), new DefaultContractResolver());
|
|
||||||
var model = new Class1();
|
|
||||||
object targetObject = model;
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.False(visitStatus);
|
|
||||||
Assert.Equal(string.Format(ErrorMessageFormats.TargetLocationAtPathSegmentNotFound, "NonExisting"), message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
using System.Collections.Generic;
|
|
||||||
using Newtonsoft.Json.Serialization;
|
|
||||||
using Xunit;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.JsonPatch.Internal
|
|
||||||
{
|
|
||||||
public class ObjectVisitorTest
|
|
||||||
{
|
|
||||||
private class Class1
|
|
||||||
{
|
|
||||||
public IList<string> States { get; set; } = new List<string>();
|
|
||||||
public IDictionary<string, string> Countries = new Dictionary<string, string>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<object[]> ReturnsListAdapterData
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var model = new Class1();
|
|
||||||
yield return new object[] { model, "/States/-", model.States };
|
|
||||||
|
|
||||||
yield return new object[] { model.States, "/-", model.States };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Theory]
|
|
||||||
[MemberData(nameof(ReturnsListAdapterData))]
|
|
||||||
public void Visit_ValidPathToArray_ReturnsListAdapter(object targetObject, string path, object expectedTargetObject)
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath(path), new DefaultContractResolver());
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.True(visitStatus);
|
|
||||||
Assert.True(string.IsNullOrEmpty(message), "Expected no error message");
|
|
||||||
Assert.Same(expectedTargetObject, targetObject);
|
|
||||||
Assert.IsType<ListAdapter>(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void Visit_ValidPathToDictionary_ReturnsDictionaryAdapter()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath("/Countries/USA"), new DefaultContractResolver());
|
|
||||||
var model = new Class1();
|
|
||||||
object targetObject = model;
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.True(visitStatus);
|
|
||||||
Assert.True(string.IsNullOrEmpty(message), "Expected no error message");
|
|
||||||
Assert.Same(model.Countries, targetObject);
|
|
||||||
Assert.IsType<DictionaryAdapter>(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class AutomobileDepartment
|
|
||||||
{
|
|
||||||
public List<Class1> Customers { get; set; } = new List<Class1>();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void Visit_ValidPathToArray_ReturnsListAdapter_ForDeepNestedPath()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath("/Customers/0/States/-"), new DefaultContractResolver());
|
|
||||||
var customer = new Class1();
|
|
||||||
var automobileDepartment = new AutomobileDepartment();
|
|
||||||
automobileDepartment.Customers.Add(customer);
|
|
||||||
object targetObject = automobileDepartment;
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.True(visitStatus);
|
|
||||||
Assert.True(string.IsNullOrEmpty(message), "Expected no error message");
|
|
||||||
Assert.Same(customer.States, targetObject);
|
|
||||||
Assert.IsType<ListAdapter>(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void Visit_InvalidPathToArray_Fails()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var invalidIndex = 2;
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath($"/Customers/{invalidIndex}/States/-"), new DefaultContractResolver());
|
|
||||||
var automobileDepartment = new AutomobileDepartment();
|
|
||||||
object targetObject = automobileDepartment;
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.False(visitStatus);
|
|
||||||
Assert.Equal(string.Format(ErrorMessageFormats.IndexOutOfBounds, invalidIndex), message);
|
|
||||||
}
|
|
||||||
|
|
||||||
// The adapter takes care of the responsibility of validating the final segment
|
|
||||||
[Fact]
|
|
||||||
public void Visit_DoesNotValidate_FinalPathSegment()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var visitor = new ObjectVisitor(new ParsedPath($"/NonExisting"), new DefaultContractResolver());
|
|
||||||
var model = new Class1();
|
|
||||||
object targetObject = model;
|
|
||||||
IAdapter adapter = null;
|
|
||||||
string message = null;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var visitStatus = visitor.TryVisit(ref targetObject, out adapter, out message);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.True(visitStatus);
|
|
||||||
Assert.True(string.IsNullOrEmpty(message), "Expected no error message");
|
|
||||||
Assert.IsType<PocoAdapter>(adapter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
{
|
|
||||||
"buildOptions": {
|
|
||||||
"warningsAsErrors": true
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"dotnet-test-xunit": "2.2.0-*",
|
|
||||||
"Microsoft.AspNetCore.JsonPatch": "1.2.0-*",
|
|
||||||
"Microsoft.AspNetCore.Testing": "1.2.0-*",
|
|
||||||
"Moq": "4.6.36-*",
|
|
||||||
"xunit": "2.2.0-*"
|
|
||||||
},
|
|
||||||
"testRunner": "xunit",
|
|
||||||
"frameworks": {
|
|
||||||
"netcoreapp1.1": {
|
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"version": "1.2.0-*",
|
|
||||||
"type": "platform"
|
|
||||||
},
|
|
||||||
"System.Diagnostics.TraceSource": "4.4.0-*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"net451": {
|
|
||||||
"frameworkAssemblies": {
|
|
||||||
"System.Linq.Expressions": {
|
|
||||||
"type": "build"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
<!-- This file may be overwritten by automation. Only values allowed here are VersionPrefix and VersionSuffix. -->
|
||||||
|
<Project>
|
||||||
|
<PropertyGroup>
|
||||||
|
<VersionPrefix>1.2.0</VersionPrefix>
|
||||||
|
<VersionSuffix>preview1</VersionSuffix>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
Loading…
Reference in New Issue