From 447966b48ee4d300663eb07a69fd4afd53698595 Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 1 Nov 2026 13:30:12 +0100 Subject: [PATCH] InitSetters sample: .NET 10, xUnit asserts, Tokyo coordinates fixed, set/required/records/primary constructor examples --- .../InitSetters.Tests/CityTests.cs | 67 ++++++++++++++++--- .../InitSetters.Tests.csproj | 11 ++- .../InitSetters/InitSetters/Airport.cs | 8 +++ .../InitSetters/InitSetters/Coordinates.cs | 4 ++ .../InitSetters/InitSetters/Country.cs | 8 +++ .../InitSetters/InitSetters.csproj | 2 +- .../InitSetters/InitSetters/Landmark.cs | 8 +++ .../InitSetters/InitSetters/Program.cs | 23 ++++++- 8 files changed, 113 insertions(+), 18 deletions(-) create mode 100644 csharp-basic-topics/InitSetters/InitSetters/Airport.cs create mode 100644 csharp-basic-topics/InitSetters/InitSetters/Coordinates.cs create mode 100644 csharp-basic-topics/InitSetters/InitSetters/Country.cs create mode 100644 csharp-basic-topics/InitSetters/InitSetters/Landmark.cs diff --git a/csharp-basic-topics/InitSetters/InitSetters.Tests/CityTests.cs b/csharp-basic-topics/InitSetters/InitSetters.Tests/CityTests.cs index 62e5ad9304..1363f42a00 100644 --- a/csharp-basic-topics/InitSetters/InitSetters.Tests/CityTests.cs +++ b/csharp-basic-topics/InitSetters/InitSetters.Tests/CityTests.cs @@ -1,12 +1,10 @@ -using FluentAssertions; - namespace InitSetters.Tests { public class CityTests { private readonly string _name = "Tokyo"; - private readonly double _lat = 139.839478; - private readonly double _lon = 35.652832; + private readonly double _lat = 35.652832; + private readonly double _lon = 139.839478; [Fact] public void WhenConstructorIsInvoked_ThenValidObjectIsReturned() @@ -15,9 +13,9 @@ public void WhenConstructorIsInvoked_ThenValidObjectIsReturned() var city = new City(_name, _lat, _lon); // Assert - city.Name.Should().Be(_name); - city.Latitude.Should().Be(_lat); - city.Longitude.Should().Be(_lon); + Assert.Equal(_name, city.Name); + Assert.Equal(_lat, city.Latitude); + Assert.Equal(_lon, city.Longitude); } [Fact] @@ -31,7 +29,58 @@ public void WhenChangeNameIsInvoked_ThenNameIsChanged() city.ChangeName(newName); // Assert - city.Name.Should().Be(newName); + Assert.Equal(newName, city.Name); + } + + [Fact] + public void WhenSetPropertyIsAssignedAfterCreation_ThenValueChanges() + { + // Arrange + var landmark = new Landmark { Name = "Senso-ji", City = "Tokyo" }; + + // Act + landmark.Name = "Senso-ji Temple"; + + // Assert + Assert.Equal("Senso-ji Temple", landmark.Name); + Assert.Equal("Tokyo", landmark.City); + } + + [Fact] + public void WhenRequiredPropertyIsSet_ThenObjectIsCreated() + { + // Act + var japan = new Country { Name = "Japan", Capital = "Tokyo" }; + + // Assert + Assert.Equal("Japan", japan.Name); + Assert.Equal("Tokyo", japan.Capital); + } + + [Fact] + public void WhenWithExpressionIsUsed_ThenOriginalIsUnchanged() + { + // Arrange + var tokyo = new Coordinates(35.652832, 139.839478); + + // Act + var tower = tokyo with { Latitude = 35.658581, Longitude = 139.745438 }; + + // Assert + Assert.Equal(35.652832, tokyo.Latitude); + Assert.Equal(35.658581, tower.Latitude); + Assert.NotSame(tokyo, tower); + } + + [Fact] + public void WhenObjectInitializerFollowsPrimaryConstructor_ThenInitializerWins() + { + // Act + var haneda = new Airport("HND", "Haneda") { Name = "Tokyo International" }; + + // Assert + Assert.Equal("HND", haneda.Code); + Assert.Equal("Tokyo International", haneda.Name); } } -} \ No newline at end of file +} diff --git a/csharp-basic-topics/InitSetters/InitSetters.Tests/InitSetters.Tests.csproj b/csharp-basic-topics/InitSetters/InitSetters.Tests/InitSetters.Tests.csproj index c654084b89..aedc6a6f50 100644 --- a/csharp-basic-topics/InitSetters/InitSetters.Tests/InitSetters.Tests.csproj +++ b/csharp-basic-topics/InitSetters/InitSetters.Tests/InitSetters.Tests.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable @@ -10,14 +10,13 @@ - - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/csharp-basic-topics/InitSetters/InitSetters/Airport.cs b/csharp-basic-topics/InitSetters/InitSetters/Airport.cs new file mode 100644 index 0000000000..18a23e2418 --- /dev/null +++ b/csharp-basic-topics/InitSetters/InitSetters/Airport.cs @@ -0,0 +1,8 @@ +namespace InitSetters +{ + public class Airport(string code, string name) + { + public string Code { get; init; } = code; + public string Name { get; init; } = name; + } +} diff --git a/csharp-basic-topics/InitSetters/InitSetters/Coordinates.cs b/csharp-basic-topics/InitSetters/InitSetters/Coordinates.cs new file mode 100644 index 0000000000..a5e504aab2 --- /dev/null +++ b/csharp-basic-topics/InitSetters/InitSetters/Coordinates.cs @@ -0,0 +1,4 @@ +namespace InitSetters +{ + public record Coordinates(double Latitude, double Longitude); +} diff --git a/csharp-basic-topics/InitSetters/InitSetters/Country.cs b/csharp-basic-topics/InitSetters/InitSetters/Country.cs new file mode 100644 index 0000000000..ee1ea43088 --- /dev/null +++ b/csharp-basic-topics/InitSetters/InitSetters/Country.cs @@ -0,0 +1,8 @@ +namespace InitSetters +{ + public class Country + { + public required string Name { get; init; } + public string? Capital { get; init; } + } +} diff --git a/csharp-basic-topics/InitSetters/InitSetters/InitSetters.csproj b/csharp-basic-topics/InitSetters/InitSetters/InitSetters.csproj index f02677bf64..dfb40caafc 100644 --- a/csharp-basic-topics/InitSetters/InitSetters/InitSetters.csproj +++ b/csharp-basic-topics/InitSetters/InitSetters/InitSetters.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net10.0 enable enable diff --git a/csharp-basic-topics/InitSetters/InitSetters/Landmark.cs b/csharp-basic-topics/InitSetters/InitSetters/Landmark.cs new file mode 100644 index 0000000000..1678391762 --- /dev/null +++ b/csharp-basic-topics/InitSetters/InitSetters/Landmark.cs @@ -0,0 +1,8 @@ +namespace InitSetters +{ + public class Landmark + { + public string Name { get; set; } = ""; + public string City { get; init; } = ""; + } +} diff --git a/csharp-basic-topics/InitSetters/InitSetters/Program.cs b/csharp-basic-topics/InitSetters/InitSetters/Program.cs index 39fd89b462..06132da550 100644 --- a/csharp-basic-topics/InitSetters/InitSetters/Program.cs +++ b/csharp-basic-topics/InitSetters/InitSetters/Program.cs @@ -4,13 +4,32 @@ internal class Program { static void Main(string[] args) { - var city = new City("Tokyo", 139.839478, 35.652832); + var city = new City("Tokyo", 35.652832, 139.839478); Console.WriteLine($"{city.Name}: {city.Latitude}, {city.Longitude}"); city.ChangeName("Edo"); Console.WriteLine($"{city.Name}: {city.Latitude}, {city.Longitude}"); + + var landmark = new Landmark { Name = "Senso-ji", City = "Tokyo" }; + landmark.Name = "Senso-ji Temple"; + + Console.WriteLine($"{landmark.Name} is in {landmark.City}"); + + var japan = new Country { Name = "Japan", Capital = "Tokyo" }; + + Console.WriteLine($"{japan.Name}: {japan.Capital}"); + + var tokyo = new Coordinates(35.652832, 139.839478); + var tower = tokyo with { Latitude = 35.658581, Longitude = 139.745438 }; + + Console.WriteLine(tokyo); + Console.WriteLine(tower); + + var haneda = new Airport("HND", "Haneda") { Name = "Tokyo International" }; + + Console.WriteLine($"{haneda.Code}: {haneda.Name}"); } } -} \ No newline at end of file +}