Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge release candidate code #4

Open
wants to merge 38 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
21cf2d0
Fix benchmarks
dev-experience Jul 16, 2021
f3123fa
Minor refactoring in `Xtz.StronglyTyped.BogusAutoFixture.UnitTests`
dev-experience Jul 16, 2021
6ed6685
Fix `ShouldThrowIfEmpty()` in `StronglyTyped<>` class form `decimal i…
dev-experience Jul 16, 2021
512a398
Consolidate NuGet package versions
dev-experience Jul 16, 2021
417464c
Update `Xtz.StronglyTyped.BuiltinTypes.AutoFixture`
dev-experience Jul 16, 2021
359d00e
Update `StronglyTypedGenerator`
dev-experience Jul 16, 2021
6c806cf
Add more tests to `Xtz.StronglyTyped.SourceGenerator.IntegrationTests`
dev-experience Jul 16, 2021
559cb97
Implement strongly-typed JSON converter for NewtonsoftJson
dev-experience Jul 16, 2021
47fc2f3
Fix `Xtz.StronglyTyped.Api_3_1.IntegrationTests`
dev-experience Jul 16, 2021
912dc63
Remove redundant test models
dev-experience Jul 16, 2021
9df75fe
Update `Xtz.StronglyTyped.UnitTests`
dev-experience Jul 16, 2021
dc131f5
Add `Xtz.StronglyTyped.NewtonsoftJson.UnitTests`
dev-experience Jul 16, 2021
25deb9e
Bump up the versions
dev-experience Jul 16, 2021
ad811ff
Merge branch 'main' into feature/release-candidate
dev-experience Jul 16, 2021
087a66e
Upgrade NuGet dependencies and fix `nullable` warnings
dev-experience Jul 16, 2021
988d42e
Fix tests for non-string values
dev-experience Jul 16, 2021
183caf2
Fix JSON converters
dev-experience Jul 16, 2021
943342b
Bump up the versions
dev-experience Jul 16, 2021
50d05fa
Remove redundant NuGet references
dev-experience Jul 17, 2021
fd401c6
Revert NuGet upgrades as they break `Xtz.StronglyTyped.SourceGenerator`
dev-experience Jul 17, 2021
d9325cc
Improve code coverage results by marking generated code with attribut…
dev-experience Jul 17, 2021
2fc2e28
Bump up the versions
dev-experience Jul 17, 2021
2d44407
Eliminate compiler and analyzer warnings by applying suggested action…
dev-experience Jul 17, 2021
d2f4e3f
Fix assembly conflict warnings
dev-experience Jul 17, 2021
bac5674
Minor project files cleanup
dev-experience Jul 17, 2021
f2c99f4
Refactor generator
dev-experience Jul 17, 2021
d18e072
Refactor JSON converters
dev-experience Jul 17, 2021
2581ac8
Add `[DebuggerDisplay]` and `.ToString()` to records in `Xtz.Strongly…
dev-experience Jul 17, 2021
02c52be
Resovle some `// TODO:`
dev-experience Jul 17, 2021
73a6c8b
Fix a bug of failing to analyze incomplete code
dev-experience Jul 17, 2021
a35e9a6
Minor refactoring
dev-experience Jul 17, 2021
493a05e
Remove `IConvertible` tests
dev-experience Jul 17, 2021
5f0894c
Minor refactoring
dev-experience Jul 17, 2021
a9aa9a9
Bump up versions
dev-experience Jul 17, 2021
549a160
Add `NUnit.Analyzers` and apply suggestions
dev-experience Jul 17, 2021
a108124
Add more static analyzers and fix/suppress warnings
dev-experience Jul 17, 2021
a9d43c2
Set analysis level for .NET analyzer
dev-experience Jul 17, 2021
ed7ed33
Apply code analysis suggestions or explicitly suppress them
dev-experience Jul 17, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
| **Xtz.StornglyTyped.BuiltinTypes.AutoFixture** | [![NuGet](http://img.shields.io/nuget/v/Xtz.StronglyTyped.BuiltinTypes.AutoFixture.svg)](https://www.nuget.org/packages/Xtz.StronglyTyped.BuiltinTypes.AutoFixture/) |
| **Xtz.StornglyTyped.BuiltinTypes.Bogus** | [![NuGet](http://img.shields.io/nuget/v/Xtz.StronglyTyped.BuiltinTypes.Bogus.svg)](https://www.nuget.org/packages/Xtz.StronglyTyped.BuiltinTypes.Bogus/) |
| **Xtz.StornglyTyped.EntityFramework** | [![NuGet](http://img.shields.io/nuget/v/Xtz.StronglyTyped.EntityFramework.svg)](https://www.nuget.org/packages/Xtz.StronglyTyped.EntityFramework/) |
| **Xtz.StronglyTyped.NewtonsoftJson** | [![NuGet](http://img.shields.io/nuget/v/Xtz.StronglyTyped.NewtonsoftJson.svg)](https://www.nuget.org/packages/Xtz.StronglyTyped.NewtonsoftJson/) |
| **Xtz.StornglyTyped.SourceGenerator** | [![NuGet](http://img.shields.io/nuget/v/Xtz.StronglyTyped.SourceGenerator.svg)](https://www.nuget.org/packages/Xtz.StronglyTyped.SourceGenerator/) |
| **Xtz.StornglyTyped.Swashbuckle** | [![NuGet](http://img.shields.io/nuget/v/Xtz.StronglyTyped.Swashbuckle.svg)](https://www.nuget.org/packages/Xtz.StronglyTyped.Swashbuckle/) |

Expand Down
4 changes: 4 additions & 0 deletions src/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[*.cs]

# RCS1124: Inline local variable.
dotnet_diagnostic.RCS1124.severity = none
8 changes: 8 additions & 0 deletions src/Misc/Xtz.StronglyTyped.Benchmark/GlobalSuppressions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage
// attributes that are applied to this project.
// Project-level suppressions either have no target or are given
// a specific target and scoped to a namespace, type, member, etc.

using System.Diagnostics.CodeAnalysis;

[assembly: SuppressMessage("Major Code Smell", "S1854:Unused assignments should be removed", Justification = "Vlad DX: Reviewed. It's intentional", Scope = "member", Target = "~M:Xtz.StronglyTyped.Benchmark.Program.Main()")]
2 changes: 1 addition & 1 deletion src/Misc/Xtz.StronglyTyped.Benchmark/Models/IntStructId.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public partial struct IntStructId
private bool IsValid(int value)
{
// ID must be greater than 0
return value <= 0;
return value > 0;
}
}
}
11 changes: 6 additions & 5 deletions src/Misc/Xtz.StronglyTyped.Benchmark/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,23 @@

namespace Xtz.StronglyTyped.Benchmark
{
public class Program
public static class Program
{
public const int VALUE_COUNT = 1000;

public static void Main(string[] args)
public static void Main()
{
// ReSharper disable once RedundantAssignment
var config = DefaultConfig.Instance;

#if DEBUG
config = new DebugBuildConfig();
#endif

BenchmarkRunner.Run<SystemTextJsonSerializationEmails>(config);
BenchmarkRunner.Run<SystemTextJsonSerializationMacAddress>();
BenchmarkRunner.Run<SystemTextJsonSerializationGuidIds>();
BenchmarkRunner.Run<SystemTextJsonSerializationIntIds>();
BenchmarkRunner.Run<SystemTextJsonSerializationMacAddress>(config);
BenchmarkRunner.Run<SystemTextJsonSerializationGuidIds>(config);
BenchmarkRunner.Run<SystemTextJsonSerializationIntIds>(config);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public SystemTextJsonSerializationEmails()
{
////System.Diagnostics.Debugger.Launch();

var fakerBuilder = new InternetFakerBuilder(true);
var fakerBuilder = new InternetFakerBuilder();
var faker = fakerBuilder.BuildEmailFaker();

_emails = faker.Generate(Program.VALUE_COUNT).ToArray();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ namespace Xtz.StronglyTyped.Benchmark
[MemoryDiagnoser]
public class SystemTextJsonSerializationGuidIds
{
private readonly Faker<EmployeeGuidId> _faker;

private readonly EmployeeGuidId[] _employeeGuidIds;

private readonly EmployeeGuidId[] _otherEmployeeGuidIds;
Expand All @@ -22,10 +20,10 @@ public class SystemTextJsonSerializationGuidIds

public SystemTextJsonSerializationGuidIds()
{
_faker = new Faker<EmployeeGuidId>();
var faker = new Faker<EmployeeGuidId>();

_employeeGuidIds = _faker.Generate(Program.VALUE_COUNT).ToArray();
_otherEmployeeGuidIds = _faker.Generate(Program.VALUE_COUNT).ToArray();
_employeeGuidIds = faker.Generate(Program.VALUE_COUNT).ToArray();
_otherEmployeeGuidIds = faker.Generate(Program.VALUE_COUNT).ToArray();
_guids = _employeeGuidIds.Select(x => x.Value).ToArray();
_stronglyTypedGuidStructs = _employeeGuidIds.Select(x => (GuidStructId)x.Value).ToArray();
}
Expand All @@ -38,21 +36,21 @@ public string SerializeEmailStrings()
}

[Benchmark(Description = "StronglyTyped<ValueType<Guid>>")]
public string SerializeStronglyTypedStringStructs()
public string SerializeStronglyTypedGuidStructs()
{
var result = JsonSerializer.Serialize(_stronglyTypedGuidStructs);
return result;
}

[Benchmark(Description = "StronglyTyped<Guid>")]
public string SerializeStronglyTypedEmails()
public string SerializeStronglyTypedGuids()
{
var result = JsonSerializer.Serialize(_employeeGuidIds);
return result;
}

[Benchmark(Description = "Other StronglyTyped<Guid>")]
public string SerializeOtherStronglyTypedEmails()
public string SerializeOtherStronglyTypedGuids()
{
var result = JsonSerializer.Serialize(_otherEmployeeGuidIds);
return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ namespace Xtz.StronglyTyped.Benchmark
[MemoryDiagnoser]
public class SystemTextJsonSerializationIntIds
{
private readonly Faker<CompanyIntId> _faker;

private readonly CompanyIntId[] _companyIntIds;

private readonly CompanyIntId[] _otherCompanyIntIds;
Expand All @@ -22,38 +20,38 @@ public class SystemTextJsonSerializationIntIds

public SystemTextJsonSerializationIntIds()
{
_faker = new Faker<CompanyIntId>()
var faker = new Faker<CompanyIntId>()
.CustomInstantiator(f => new CompanyIntId(Math.Abs(f.Random.Int())));

_companyIntIds = _faker.Generate(Program.VALUE_COUNT).ToArray();
_otherCompanyIntIds = _faker.Generate(Program.VALUE_COUNT).ToArray();
_companyIntIds = faker.Generate(Program.VALUE_COUNT).ToArray();
_otherCompanyIntIds = faker.Generate(Program.VALUE_COUNT).ToArray();
_ints = _companyIntIds.Select(x => x.Value).ToArray();
_stronglyTypedIntStructs = _companyIntIds.Select(x => (IntStructId)x.Value).ToArray();
}

[Benchmark(Baseline = true, Description = "int")]
public string SerializeEmailStrings()
public string SerializeInts()
{
var result = JsonSerializer.Serialize(_ints);
return result;
}

[Benchmark(Description = "StronglyTyped<ValueType<int>>")]
public string SerializeStronglyTypedStringStructs()
public string SerializeStronglyTypedIntStructs()
{
var result = JsonSerializer.Serialize(_stronglyTypedIntStructs);
return result;
}

[Benchmark(Description = "StronglyTyped<int>")]
public string SerializeStronglyTypedEmails()
public string SerializeStronglyTypedIntIds()
{
var result = JsonSerializer.Serialize(_companyIntIds);
return result;
}

[Benchmark(Description = "Other StronglyTyped<int>")]
public string SerializeOtherStronglyTypedEmails()
public string SerializeOtherStronglyTypedIntIds()
{
var result = JsonSerializer.Serialize(_otherCompanyIntIds);
return result;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System.Linq;
using System.Text.Json;
using BenchmarkDotNet.Attributes;
using Bogus;
using Xtz.StronglyTyped.Benchmark.Models;
using Xtz.StronglyTyped.BuiltinTypes.Bogus;
using Xtz.StronglyTyped.BuiltinTypes.Internet;
Expand All @@ -11,10 +10,6 @@ namespace Xtz.StronglyTyped.Benchmark
[MemoryDiagnoser]
public class SystemTextJsonSerializationMacAddress
{
private readonly InternetFakerBuilder _fakerBuilder;

private readonly Faker<MacAddress> _faker;

private readonly MacAddress[] _macAddresses;

private readonly MacAddress[] _otherMacAddresses;
Expand All @@ -27,11 +22,11 @@ public class SystemTextJsonSerializationMacAddress

public SystemTextJsonSerializationMacAddress()
{
_fakerBuilder = new InternetFakerBuilder(true);
_faker = _fakerBuilder.BuildMacAddressFaker();
var fakerBuilder = new InternetFakerBuilder();
var faker = fakerBuilder.BuildMacAddressFaker();

_macAddresses = _faker.Generate(Program.VALUE_COUNT).ToArray();
_otherMacAddresses = _faker.Generate(Program.VALUE_COUNT).ToArray();
_macAddresses = faker.Generate(Program.VALUE_COUNT).ToArray();
_otherMacAddresses = faker.Generate(Program.VALUE_COUNT).ToArray();
_strings = _macAddresses.Select(x => x.ToString()).ToArray();
_stronglyTypedStrings = _strings.Select(x => (StronglyTypedString)x).ToArray();
_stronglyTypedStructs = _strings.Select(x => (StronglyTypedStringStruct)x).ToArray();
Expand All @@ -40,7 +35,7 @@ public SystemTextJsonSerializationMacAddress()
}

[Benchmark(Baseline = true, Description = "string")]
public string SerializeEmailStrings()
public string SerializeMacAddressStrings()
{
var result = JsonSerializer.Serialize(_strings);
return result;
Expand All @@ -60,15 +55,15 @@ public string SerializeStronglyTypedStringStructs()
return result;
}

[Benchmark(Description = "StronglyTyped<MailAddress>")]
public string SerializeStronglyTypedEmails()
[Benchmark(Description = "StronglyTyped<PhysicalAddress>")]
public string SerializeStronglyTypedMacAddresses()
{
var result = JsonSerializer.Serialize(_macAddresses);
return result;
}

[Benchmark(Description = "Other StronglyTyped<MailAddress>")]
public string SerializeOtherStronglyTypedEmails()
[Benchmark(Description = "Other StronglyTyped<PhysicalAddress>")]
public string SerializeOtherStronglyTypedMacAddresses()
{
var result = JsonSerializer.Serialize(_otherMacAddresses);
return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5</TargetFramework>
<TargetFramework>netstandard2.1</TargetFramework>
</PropertyGroup>

<PropertyGroup>
Expand All @@ -12,21 +12,24 @@

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\Xtz.StronglyTyped.SourceGenerator\Xtz.StronglyTyped.SourceGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="true" />
<ProjectReference Include="..\..\Xtz.StronglyTyped.BuiltinTypes.Bogus\Xtz.StronglyTyped.BuiltinTypes.Bogus.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.1">
<PackageReference Include="Microsoft.CodeAnalysis" Version="3.8.0" />
<PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.8.0">
<PackageReference Include="Roslynator.Analyzers" Version="3.2.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.26.0.34506">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\Xtz.StronglyTyped.SourceGenerator\Xtz.StronglyTyped.SourceGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="true" />
<ProjectReference Include="..\..\Xtz.StronglyTyped.BuiltinTypes.Bogus\Xtz.StronglyTyped.BuiltinTypes.Bogus.csproj" />
</ItemGroup>

</Project>
6 changes: 3 additions & 3 deletions src/Misc/Xtz.StronglyTyped.Playground/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Xtz.StronglyTyped.Playground
{
// NOTE: Just a simple console app for demo purposes

public class Program
public static class Program
{
public static void Main()
{
Expand All @@ -25,7 +25,7 @@ public static void Main()

private static void RunAddressFakers()
{
var fakerBuilder = new AddressFakerBuilder(true);
var fakerBuilder = new AddressFakerBuilder();

var city = fakerBuilder.BuildCityFaker().Generate();
Console.WriteLine(city);
Expand Down Expand Up @@ -72,7 +72,7 @@ private static void RunAddressFakers()

private static void RunInternetFakers()
{
var fakerBuilder = new InternetFakerBuilder(true);
var fakerBuilder = new InternetFakerBuilder();

var absoluteUri = fakerBuilder.BuildAbsoluteUriFaker().Generate();
Console.WriteLine(absoluteUri);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,27 @@
</Content>
</ItemGroup>

<PropertyGroup>
<IncludeBuildOutput>false</IncludeBuildOutput>
</PropertyGroup>

<PropertyGroup>
<EmitCompilerGeneratedFiles>True</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GeneratedFiles</CompilerGeneratedFilesOutputPath>
</PropertyGroup>

<!--<ItemGroup>
--><!-- Don't include the output from a previous source generator execution into future runs; the */** trick here ensures that there's
at least one subdirectory, which is our key that it's coming from a source generator as opposed to something that is coming from
some other tool. --><!--
<Compile Remove="$(CompilerGeneratedFilesOutputPath)/*/**/*.cs" />
</ItemGroup>-->

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
<PackageReference Include="Roslynator.Analyzers" Version="3.2.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.26.0.34506">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
Expand All @@ -44,11 +45,4 @@
<ProjectReference Include="..\..\Xtz.StronglyTyped\Xtz.StronglyTyped.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="3.8.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// This file is used by Code Analysis to maintain SuppressMessage
// attributes that are applied to this project.
// Project-level suppressions either have no target or are given
// a specific target and scoped to a namespace, type, member, etc.

using System.Diagnostics.CodeAnalysis;

[assembly: SuppressMessage("Minor Code Smell", "S1481:Unused local variables should be removed", Justification = "Vlad DX: Reviewed (unit tests)", Scope = "member", Target = "~M:Xtz.StronglyTyped.Api_3_1.IntegrationTests.WebApiTests.ShouldDeserialize_ForStandardEndpoint_WhenNewtonsoftUsed~System.Threading.Tasks.Task")]
[assembly: SuppressMessage("Minor Code Smell", "S1481:Unused local variables should be removed", Justification = "Vlad DX: Reviewed (unit tests)", Scope = "member", Target = "~M:Xtz.StronglyTyped.Api_3_1.IntegrationTests.WebApiTests.ShouldDeserialize_ForStandardEndpoint_WhenSystemTextJsonUsed~System.Threading.Tasks.Task")]
[assembly: SuppressMessage("Minor Code Smell", "S1481:Unused local variables should be removed", Justification = "Vlad DX: Reviewed (unit tests)", Scope = "member", Target = "~M:Xtz.StronglyTyped.Api_3_1.IntegrationTests.WebApiTests.ShouldDeserialize_ForStronglyTypedEndpoint_WhenNewtonsoftUsed~System.Threading.Tasks.Task")]
[assembly: SuppressMessage("Minor Code Smell", "S1481:Unused local variables should be removed", Justification = "Vlad DX: Reviewed (unit tests)", Scope = "member", Target = "~M:Xtz.StronglyTyped.Api_3_1.IntegrationTests.WebApiTests.ShouldDeserialize_ForStronglyTypedEndpoint_WhenSystemTextJsonUsed~System.Threading.Tasks.Task")]
[assembly: SuppressMessage("Style", "IDE0059:Unnecessary assignment of a value", Justification = "Vlad DX: Reviewed (unit tests)", Scope = "member", Target = "~M:Xtz.StronglyTyped.Api_3_1.IntegrationTests.WebApiTests.ShouldDeserialize_ForStandardEndpoint_WhenNewtonsoftUsed~System.Threading.Tasks.Task")]
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Xtz.StronglyTyped.NewtonsoftJson;

namespace Xtz.StronglyTyped.Api_3_1.IntegrationTests.WebApi
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ public class StronglyTypedWeatherForecast
{
public City City { get; set; }

public Country NullValue { get; set; }

public DateTime Date { get; set; }

public DegreesCelsius TemperatureC { get; set; }
Expand Down
Loading