From e785755a995c8f252f4335ea406909ed581850ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= <12201973+fredericdelaporte@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:51:18 +0100 Subject: [PATCH 1/5] Support an arbitrary length for CultureInfoType fix #3473 --- src/NHibernate.DomainModel/Location.cs | 2 ++ src/NHibernate.DomainModel/Location.hbm.xml | 3 ++- src/NHibernate.Test/Legacy/FooBarTest.cs | 2 ++ src/NHibernate/Type/CultureInfoType.cs | 8 ++++++-- src/NHibernate/Type/TypeFactory.cs | 9 +++++---- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/NHibernate.DomainModel/Location.cs b/src/NHibernate.DomainModel/Location.cs index 4559856996e..da6db4f0d41 100644 --- a/src/NHibernate.DomainModel/Location.cs +++ b/src/NHibernate.DomainModel/Location.cs @@ -52,6 +52,8 @@ public CultureInfo Locale set { _locale = value; } } + public CultureInfo ExtendedLocale { get; set; } + #region System.Object Members public override bool Equals(object obj) diff --git a/src/NHibernate.DomainModel/Location.hbm.xml b/src/NHibernate.DomainModel/Location.hbm.xml index 56aed1ea773..65a031047d6 100644 --- a/src/NHibernate.DomainModel/Location.hbm.xml +++ b/src/NHibernate.DomainModel/Location.hbm.xml @@ -19,6 +19,7 @@ /> + - \ No newline at end of file + diff --git a/src/NHibernate.Test/Legacy/FooBarTest.cs b/src/NHibernate.Test/Legacy/FooBarTest.cs index 9704b5dc737..3685a3629ae 100644 --- a/src/NHibernate.Test/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Legacy/FooBarTest.cs @@ -5150,6 +5150,7 @@ public void EmbeddedCompositeID() l.CountryCode = "AU"; l.Description = "foo bar"; l.Locale = CultureInfo.CreateSpecificCulture("en-AU"); + l.ExtendedLocale = CultureInfo.CreateSpecificCulture("en-US-POSIX"); l.StreetName = "Brunswick Rd"; l.StreetNumber = 300; l.City = "Melbourne"; @@ -5165,6 +5166,7 @@ public void EmbeddedCompositeID() Assert.AreEqual("AU", l.CountryCode); Assert.AreEqual("Melbourne", l.City); Assert.AreEqual(CultureInfo.CreateSpecificCulture("en-AU"), l.Locale); + Assert.That(l.ExtendedLocale, Is.EqualTo(CultureInfo.CreateSpecificCulture("en-US-POSIX"))); s.Close(); s = OpenSession(); diff --git a/src/NHibernate/Type/CultureInfoType.cs b/src/NHibernate/Type/CultureInfoType.cs index 47daf666588..417e4b2ef89 100644 --- a/src/NHibernate/Type/CultureInfoType.cs +++ b/src/NHibernate/Type/CultureInfoType.cs @@ -8,12 +8,12 @@ namespace NHibernate.Type { /// - /// Maps a Property + /// Maps a Property /// to a column. /// /// /// CultureInfoType stores the culture name (not the Culture ID) of the - /// in the DB. + /// in the DB. /// [Serializable] public partial class CultureInfoType : ImmutableType, ILiteralType @@ -22,6 +22,10 @@ internal CultureInfoType() : base(new StringSqlType(5)) { } + internal CultureInfoType(StringSqlType sqlType) : base(sqlType) + { + } + /// public override object Get(DbDataReader rs, int index, ISessionImplementor session) { diff --git a/src/NHibernate/Type/TypeFactory.cs b/src/NHibernate/Type/TypeFactory.cs index 758353c48a4..0fd384d25c9 100644 --- a/src/NHibernate/Type/TypeFactory.cs +++ b/src/NHibernate/Type/TypeFactory.cs @@ -292,7 +292,9 @@ private static void RegisterDefaultNetTypes() RegisterType(typeof (Boolean), NHibernateUtil.Boolean, new[] { "boolean", "bool" }); RegisterType(typeof (Byte), NHibernateUtil.Byte, new[]{ "byte"}); RegisterType(typeof (Char), NHibernateUtil.Character, new[] {"character", "char"}); - RegisterType(typeof (CultureInfo), NHibernateUtil.CultureInfo, new[]{ "locale"}); + RegisterType(typeof (CultureInfo), NHibernateUtil.CultureInfo, new[] { "locale" }, + l => GetType(NHibernateUtil.CultureInfo, l, len => new CultureInfoType(SqlTypeFactory.GetString(len))), + false); RegisterType(typeof (DateTime), NHibernateUtil.DateTime, new[] { "datetime" }, s => GetType(NHibernateUtil.DateTime, s, scale => new DateTimeType(SqlTypeFactory.GetDateTime((byte)scale))), false); @@ -344,11 +346,10 @@ private static void RegisterDefaultNetTypes() } /// - /// Register other NO Default .NET type + /// Register types which are not a default for a .NET type. /// /// - /// These type will be used only when the "type" attribute was is specified in the mapping. - /// These are in here because needed to NO override default CLR types and be available in mappings + /// These types will be used only when the "type" attribute is specified in the mapping. /// private static void RegisterBuiltInTypes() { From eba0e651eeb67fa38d399adb5c631e8cb4b27ff4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 2 Feb 2024 16:22:41 +0000 Subject: [PATCH 2/5] Generate async files --- src/NHibernate.Test/Async/Legacy/FooBarTest.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs index f7f7f1a2b8f..79b938d0981 100644 --- a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs @@ -5162,6 +5162,7 @@ public async Task EmbeddedCompositeIDAsync() l.CountryCode = "AU"; l.Description = "foo bar"; l.Locale = CultureInfo.CreateSpecificCulture("en-AU"); + l.ExtendedLocale = CultureInfo.CreateSpecificCulture("en-US-POSIX"); l.StreetName = "Brunswick Rd"; l.StreetNumber = 300; l.City = "Melbourne"; @@ -5177,6 +5178,7 @@ public async Task EmbeddedCompositeIDAsync() Assert.AreEqual("AU", l.CountryCode); Assert.AreEqual("Melbourne", l.City); Assert.AreEqual(CultureInfo.CreateSpecificCulture("en-AU"), l.Locale); + Assert.That(l.ExtendedLocale, Is.EqualTo(CultureInfo.CreateSpecificCulture("en-US-POSIX"))); s.Close(); s = OpenSession(); From b0046cc183275077827d8cb15c31f1456db21833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= <12201973+fredericdelaporte@users.noreply.github.com> Date: Sun, 4 Feb 2024 19:04:22 +0100 Subject: [PATCH 3/5] Add a dedicated test for CultureInfoType And refactor the teardown of these tests. --- src/NHibernate.DomainModel/Location.cs | 2 - src/NHibernate.DomainModel/Location.hbm.xml | 3 +- .../Async/Legacy/FooBarTest.cs | 2 - .../TypesTest/AbstractDateTimeTypeFixture.cs | 12 +- .../Async/TypesTest/CultureInfoTypeFixture.cs | 107 ++++++++++++++++++ .../TypesTest/DateTimeOffsetTypeFixture.cs | 20 ++-- .../Async/TypesTest/DecimalTypeFixture.cs | 12 -- .../Async/TypesTest/EnumStringTypeFixture.cs | 8 -- .../TypesTest/GenericEnumStringTypeFixture.cs | 8 -- .../Async/TypesTest/StringTypeFixture.cs | 8 -- .../TypesTest/TimeAsTimeSpanTypeFixture.cs | 12 -- src/NHibernate.Test/Legacy/FooBarTest.cs | 2 - .../TypesTest/AbstractDateTimeTypeFixture.cs | 12 +- .../TypesTest/CultureInfoClass.cs | 12 ++ .../TypesTest/CultureInfoClass.hbm.xml | 9 ++ .../TypesTest/CultureInfoTypeFixture.cs | 104 +++++++++++++++++ .../TypesTest/DateTimeOffsetTypeFixture.cs | 20 ++-- .../TypesTest/DecimalTypeFixture.cs | 12 -- .../TypesTest/EnumStringTypeFixture.cs | 8 -- .../TypesTest/GenericEnumStringTypeFixture.cs | 8 -- .../TypesTest/StringTypeFixture.cs | 8 -- .../TypesTest/TimeAsTimeSpanTypeFixture.cs | 12 -- .../TypesTest/TypeFixtureBase.cs | 25 ++-- 23 files changed, 266 insertions(+), 160 deletions(-) create mode 100644 src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs create mode 100644 src/NHibernate.Test/TypesTest/CultureInfoClass.cs create mode 100644 src/NHibernate.Test/TypesTest/CultureInfoClass.hbm.xml create mode 100644 src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs diff --git a/src/NHibernate.DomainModel/Location.cs b/src/NHibernate.DomainModel/Location.cs index da6db4f0d41..4559856996e 100644 --- a/src/NHibernate.DomainModel/Location.cs +++ b/src/NHibernate.DomainModel/Location.cs @@ -52,8 +52,6 @@ public CultureInfo Locale set { _locale = value; } } - public CultureInfo ExtendedLocale { get; set; } - #region System.Object Members public override bool Equals(object obj) diff --git a/src/NHibernate.DomainModel/Location.hbm.xml b/src/NHibernate.DomainModel/Location.hbm.xml index 65a031047d6..56aed1ea773 100644 --- a/src/NHibernate.DomainModel/Location.hbm.xml +++ b/src/NHibernate.DomainModel/Location.hbm.xml @@ -19,7 +19,6 @@ /> - - + \ No newline at end of file diff --git a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs index 79b938d0981..f7f7f1a2b8f 100644 --- a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs @@ -5162,7 +5162,6 @@ public async Task EmbeddedCompositeIDAsync() l.CountryCode = "AU"; l.Description = "foo bar"; l.Locale = CultureInfo.CreateSpecificCulture("en-AU"); - l.ExtendedLocale = CultureInfo.CreateSpecificCulture("en-US-POSIX"); l.StreetName = "Brunswick Rd"; l.StreetNumber = 300; l.City = "Melbourne"; @@ -5178,7 +5177,6 @@ public async Task EmbeddedCompositeIDAsync() Assert.AreEqual("AU", l.CountryCode); Assert.AreEqual("Melbourne", l.City); Assert.AreEqual(CultureInfo.CreateSpecificCulture("en-AU"), l.Locale); - Assert.That(l.ExtendedLocale, Is.EqualTo(CultureInfo.CreateSpecificCulture("en-US-POSIX"))); s.Close(); s = OpenSession(); diff --git a/src/NHibernate.Test/Async/TypesTest/AbstractDateTimeTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/AbstractDateTimeTypeFixture.cs index 4588e8d1017..4307080f4cf 100644 --- a/src/NHibernate.Test/Async/TypesTest/AbstractDateTimeTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/AbstractDateTimeTypeFixture.cs @@ -69,14 +69,10 @@ protected override void OnSetUp() protected override void OnTearDown() { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DateTimeClass").ExecuteUpdate(); - t.Commit(); - } + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery("delete from DateTimeClass").ExecuteUpdate(); + t.Commit(); } protected override void DropSchema() diff --git a/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs new file mode 100644 index 00000000000..a86fac7d458 --- /dev/null +++ b/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs @@ -0,0 +1,107 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by AsyncGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +using System; +using System.Globalization; +using NHibernate.Dialect; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + using System.Threading.Tasks; + [TestFixture] + public class CultureInfoTypeFixtureAsync : TypeFixtureBase + { + protected override string TypeName + { + get { return "CultureInfo"; } + } + + [Test] + public async Task ReadWriteBasicCultureAsync() + { + Guid id; + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = new CultureInfoClass { BasicCulture = CultureInfo.GetCultureInfo("en-US") }; + await (s.SaveAsync(entity)); + id = entity.Id; + await (t.CommitAsync()); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = await (s.GetAsync(id)); + Assert.That(entity.BasicCulture, Is.Not.Null); + Assert.That(entity.BasicCulture.Name, Is.EqualTo("en-US")); + Assert.That(entity.BasicCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US"))); + entity.BasicCulture = CultureInfo.GetCultureInfo("fr-BE"); + await (t.CommitAsync()); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = await (s.GetAsync(id)); + Assert.That(entity.BasicCulture.Name, Is.EqualTo("fr-BE")); + Assert.That(entity.BasicCulture, Is.EqualTo(CultureInfo.GetCultureInfo("fr-BE"))); + entity.BasicCulture = null; + await (t.CommitAsync()); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = await (s.GetAsync(id)); + Assert.That(entity.BasicCulture, Is.Null); + await (t.CommitAsync()); + } + } + + [Test] + public async Task ReadWriteExtendedCultureAsync() + { + Guid id; + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = new CultureInfoClass { ExtendedCulture = CultureInfo.GetCultureInfo("en-US-posix") }; + await (s.SaveAsync(entity)); + id = entity.Id; + await (t.CommitAsync()); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = await (s.GetAsync(id)); + Assert.That(entity.ExtendedCulture, Is.Not.Null); + Assert.That(entity.ExtendedCulture.Name, Is.EqualTo("en-US-posix")); + Assert.That(entity.ExtendedCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US-posix"))); + await (t.CommitAsync()); + } + } + + [Test] + public async Task WriteTooLongCultureAsync() + { + if (Dialect is SQLiteDialect) + Assert.Ignore("SQLite has no length limited string type."); + using var s = OpenSession(); + using var t = s.BeginTransaction(); + var entity = new CultureInfoClass { BasicCulture = CultureInfo.GetCultureInfo("en-US-posix") }; + await (s.SaveAsync(entity)); + Assert.That(t.Commit, Throws.Exception); + } + } +} diff --git a/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs index 64e62c0e326..1c604513d85 100644 --- a/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs @@ -69,18 +69,6 @@ protected override void OnSetUp() } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DateTimeOffsetClass").ExecuteUpdate(); - t.Commit(); - } - } - protected override void DropSchema() { (Sfi.ConnectionProvider.Driver as ClientDriverWithParamsStats)?.CleanUp(); @@ -354,6 +342,14 @@ public class DateTimeOffsetTypeWithScaleFixtureAsync : DateTimeOffsetTypeFixture // The timestamp rounding in seeding does not account scale. protected override bool RevisionCheck => false; + protected override void OnTearDown() + { + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery("delete DateTimeOffsetClass").ExecuteUpdate(); + t.Commit(); + } + [Test] public async Task LowerDigitsAreIgnoredAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/DecimalTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/DecimalTypeFixture.cs index c4ab2a0c6f0..1917cbd0b4b 100644 --- a/src/NHibernate.Test/Async/TypesTest/DecimalTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/DecimalTypeFixture.cs @@ -54,18 +54,6 @@ protected override void OnSetUp() } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DecimalClass").ExecuteUpdate(); - t.Commit(); - } - } - [Test] public async Task ReadWriteAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/EnumStringTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/EnumStringTypeFixture.cs index 255951b0b7a..1733fd0bce8 100644 --- a/src/NHibernate.Test/Async/TypesTest/EnumStringTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/EnumStringTypeFixture.cs @@ -40,14 +40,6 @@ protected override void OnSetUp() s.Close(); } - protected override void OnTearDown() - { - ISession s = OpenSession(); - s.Delete("from EnumStringClass"); - s.Flush(); - s.Close(); - } - [Test] public async Task ReadFromLoadAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/GenericEnumStringTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/GenericEnumStringTypeFixture.cs index 699ef01850b..06aa32c1ab7 100644 --- a/src/NHibernate.Test/Async/TypesTest/GenericEnumStringTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/GenericEnumStringTypeFixture.cs @@ -42,14 +42,6 @@ protected override void OnSetUp() s.Close(); } - protected override void OnTearDown() - { - ISession s = OpenSession(); - s.Delete("from GenericEnumStringClass"); - s.Flush(); - s.Close(); - } - [Test] public async Task ReadFromLoadAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/StringTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/StringTypeFixture.cs index a7d74e58e4d..0808ca7e837 100644 --- a/src/NHibernate.Test/Async/TypesTest/StringTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/StringTypeFixture.cs @@ -26,14 +26,6 @@ protected override string TypeName get { return "String"; } } - protected override void OnTearDown() - { - using (var s = OpenSession()) - { - s.CreateQuery("delete from StringClass").ExecuteUpdate(); - } - } - [Test] public async Task InsertNullValueAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/TimeAsTimeSpanTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/TimeAsTimeSpanTypeFixture.cs index 134fdee1b32..f9c585d7956 100644 --- a/src/NHibernate.Test/Async/TypesTest/TimeAsTimeSpanTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/TimeAsTimeSpanTypeFixture.cs @@ -50,18 +50,6 @@ protected override string TypeName get { return "TimeAsTimeSpan"; } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var tx = s.BeginTransaction()) - { - s.CreateQuery("delete from TimeAsTimeSpanClass").ExecuteUpdate(); - tx.Commit(); - } - } - [Test] public async Task SavingAndRetrievingAsync() { diff --git a/src/NHibernate.Test/Legacy/FooBarTest.cs b/src/NHibernate.Test/Legacy/FooBarTest.cs index 3685a3629ae..9704b5dc737 100644 --- a/src/NHibernate.Test/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Legacy/FooBarTest.cs @@ -5150,7 +5150,6 @@ public void EmbeddedCompositeID() l.CountryCode = "AU"; l.Description = "foo bar"; l.Locale = CultureInfo.CreateSpecificCulture("en-AU"); - l.ExtendedLocale = CultureInfo.CreateSpecificCulture("en-US-POSIX"); l.StreetName = "Brunswick Rd"; l.StreetNumber = 300; l.City = "Melbourne"; @@ -5166,7 +5165,6 @@ public void EmbeddedCompositeID() Assert.AreEqual("AU", l.CountryCode); Assert.AreEqual("Melbourne", l.City); Assert.AreEqual(CultureInfo.CreateSpecificCulture("en-AU"), l.Locale); - Assert.That(l.ExtendedLocale, Is.EqualTo(CultureInfo.CreateSpecificCulture("en-US-POSIX"))); s.Close(); s = OpenSession(); diff --git a/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs b/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs index 67b36a0d2cc..0d95535b947 100644 --- a/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs @@ -57,14 +57,10 @@ protected override void OnSetUp() protected override void OnTearDown() { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DateTimeClass").ExecuteUpdate(); - t.Commit(); - } + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery("delete from DateTimeClass").ExecuteUpdate(); + t.Commit(); } protected override void DropSchema() diff --git a/src/NHibernate.Test/TypesTest/CultureInfoClass.cs b/src/NHibernate.Test/TypesTest/CultureInfoClass.cs new file mode 100644 index 00000000000..601cf00fbda --- /dev/null +++ b/src/NHibernate.Test/TypesTest/CultureInfoClass.cs @@ -0,0 +1,12 @@ +using System; +using System.Globalization; + +namespace NHibernate.Test.TypesTest +{ + public class CultureInfoClass + { + public Guid Id { get; set; } + public CultureInfo BasicCulture { get; set; } + public CultureInfo ExtendedCulture { get; set; } + } +} diff --git a/src/NHibernate.Test/TypesTest/CultureInfoClass.hbm.xml b/src/NHibernate.Test/TypesTest/CultureInfoClass.hbm.xml new file mode 100644 index 00000000000..8472d89d7f0 --- /dev/null +++ b/src/NHibernate.Test/TypesTest/CultureInfoClass.hbm.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs b/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs new file mode 100644 index 00000000000..7c7977941fe --- /dev/null +++ b/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs @@ -0,0 +1,104 @@ +using System; +using System.Globalization; +using NHibernate.Dialect; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + [TestFixture] + public class CultureInfoTypeFixture : TypeFixtureBase + { + protected override string TypeName + { + get { return "CultureInfo"; } + } + + [Test] + public void ReadWriteBasicCulture() + { + Guid id; + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = new CultureInfoClass { BasicCulture = CultureInfo.GetCultureInfo("en-US") }; + s.Save(entity); + id = entity.Id; + t.Commit(); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = s.Get(id); + Assert.That(entity.BasicCulture, Is.Not.Null); + Assert.That(entity.BasicCulture.Name, Is.EqualTo("en-US")); + Assert.That(entity.BasicCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US"))); + entity.BasicCulture = CultureInfo.GetCultureInfo("fr-BE"); + t.Commit(); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = s.Get(id); + Assert.That(entity.BasicCulture.Name, Is.EqualTo("fr-BE")); + Assert.That(entity.BasicCulture, Is.EqualTo(CultureInfo.GetCultureInfo("fr-BE"))); + entity.BasicCulture = null; + t.Commit(); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = s.Get(id); + Assert.That(entity.BasicCulture, Is.Null); + t.Commit(); + } + } + + [Test] + public void ReadWriteExtendedCulture() + { + Guid id; + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = new CultureInfoClass { ExtendedCulture = CultureInfo.GetCultureInfo("en-US-posix") }; + s.Save(entity); + id = entity.Id; + t.Commit(); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = s.Get(id); + Assert.That(entity.ExtendedCulture, Is.Not.Null); + Assert.That(entity.ExtendedCulture.Name, Is.EqualTo("en-US-posix")); + Assert.That(entity.ExtendedCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US-posix"))); + t.Commit(); + } + } + + [Test] + public void WriteTooLongCulture() + { + if (Dialect is SQLiteDialect) + Assert.Ignore("SQLite has no length limited string type."); + using var s = OpenSession(); + using var t = s.BeginTransaction(); + var entity = new CultureInfoClass { BasicCulture = CultureInfo.GetCultureInfo("en-US-posix") }; + s.Save(entity); + Assert.That(t.Commit, Throws.Exception); + } + + [Test] + public void AutoDiscoverFromNetType() + { + // integration test to be 100% sure + var propertyType = Sfi.GetEntityPersister(typeof(CultureInfoClass).FullName).GetPropertyType(nameof(CultureInfoClass.BasicCulture)); + Assert.That(propertyType, Is.InstanceOf()); + } + } +} diff --git a/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs b/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs index 0881a08e878..b38475b3a40 100644 --- a/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs @@ -57,18 +57,6 @@ protected override void OnSetUp() } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DateTimeOffsetClass").ExecuteUpdate(); - t.Commit(); - } - } - protected override void DropSchema() { (Sfi.ConnectionProvider.Driver as ClientDriverWithParamsStats)?.CleanUp(); @@ -382,6 +370,14 @@ public class DateTimeOffsetTypeWithScaleFixture : DateTimeOffsetTypeFixture // The timestamp rounding in seeding does not account scale. protected override bool RevisionCheck => false; + protected override void OnTearDown() + { + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery("delete DateTimeOffsetClass").ExecuteUpdate(); + t.Commit(); + } + [Test] public void LowerDigitsAreIgnored() { diff --git a/src/NHibernate.Test/TypesTest/DecimalTypeFixture.cs b/src/NHibernate.Test/TypesTest/DecimalTypeFixture.cs index 72561fc7008..4f839a39df8 100644 --- a/src/NHibernate.Test/TypesTest/DecimalTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/DecimalTypeFixture.cs @@ -45,18 +45,6 @@ protected override void OnSetUp() } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DecimalClass").ExecuteUpdate(); - t.Commit(); - } - } - /// /// Test that two decimal fields that are exactly equal are returned /// as Equal by the DecimalType. diff --git a/src/NHibernate.Test/TypesTest/EnumStringTypeFixture.cs b/src/NHibernate.Test/TypesTest/EnumStringTypeFixture.cs index ca3a07797df..9574983a65b 100644 --- a/src/NHibernate.Test/TypesTest/EnumStringTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/EnumStringTypeFixture.cs @@ -29,14 +29,6 @@ protected override void OnSetUp() s.Close(); } - protected override void OnTearDown() - { - ISession s = OpenSession(); - s.Delete("from EnumStringClass"); - s.Flush(); - s.Close(); - } - [Test] public void ReadFromLoad() { diff --git a/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs b/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs index ea64fc18a2c..1ff4f62313a 100644 --- a/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs @@ -31,14 +31,6 @@ protected override void OnSetUp() s.Close(); } - protected override void OnTearDown() - { - ISession s = OpenSession(); - s.Delete("from GenericEnumStringClass"); - s.Flush(); - s.Close(); - } - [Test] public void ReadFromLoad() { diff --git a/src/NHibernate.Test/TypesTest/StringTypeFixture.cs b/src/NHibernate.Test/TypesTest/StringTypeFixture.cs index e544390e5ca..7a970476cfa 100644 --- a/src/NHibernate.Test/TypesTest/StringTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/StringTypeFixture.cs @@ -14,14 +14,6 @@ protected override string TypeName get { return "String"; } } - protected override void OnTearDown() - { - using (var s = OpenSession()) - { - s.CreateQuery("delete from StringClass").ExecuteUpdate(); - } - } - [Test] public void InsertNullValue() { diff --git a/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs b/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs index 5c0e2c364f0..4684693f498 100644 --- a/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs @@ -38,18 +38,6 @@ protected override string TypeName get { return "TimeAsTimeSpan"; } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var tx = s.BeginTransaction()) - { - s.CreateQuery("delete from TimeAsTimeSpanClass").ExecuteUpdate(); - tx.Commit(); - } - } - [Test] public void PropertiesHasExpectedType() { diff --git a/src/NHibernate.Test/TypesTest/TypeFixtureBase.cs b/src/NHibernate.Test/TypesTest/TypeFixtureBase.cs index 048a3670b2d..6f83d6f8127 100644 --- a/src/NHibernate.Test/TypesTest/TypeFixtureBase.cs +++ b/src/NHibernate.Test/TypesTest/TypeFixtureBase.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections; - namespace NHibernate.Test.TypesTest { /// @@ -13,20 +10,16 @@ public abstract class TypeFixtureBase : TestCase { protected abstract string TypeName { get; } - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } + protected override string MappingsAssembly => "NHibernate.Test"; + + protected override string[] Mappings => new[] { $"TypesTest.{TypeName}Class.hbm.xml" }; - protected override string[] Mappings + protected override void OnTearDown() { - get - { - return new string[] - { - String.Format("TypesTest.{0}Class.hbm.xml", TypeName) - }; - } + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery($"delete {TypeName}Class").ExecuteUpdate(); + t.Commit(); } } -} \ No newline at end of file +} From 104f437ea6926632f1b641045dcf387ef6377793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= <12201973+fredericdelaporte@users.noreply.github.com> Date: Mon, 5 Feb 2024 19:16:14 +0100 Subject: [PATCH 4/5] Fix test failure on culture casing --- .../Async/TypesTest/CultureInfoTypeFixture.cs | 8 +++----- src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs index a86fac7d458..4ec37748718 100644 --- a/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs @@ -20,10 +20,7 @@ namespace NHibernate.Test.TypesTest [TestFixture] public class CultureInfoTypeFixtureAsync : TypeFixtureBase { - protected override string TypeName - { - get { return "CultureInfo"; } - } + protected override string TypeName => "CultureInfo"; [Test] public async Task ReadWriteBasicCultureAsync() @@ -86,7 +83,8 @@ public async Task ReadWriteExtendedCultureAsync() { var entity = await (s.GetAsync(id)); Assert.That(entity.ExtendedCulture, Is.Not.Null); - Assert.That(entity.ExtendedCulture.Name, Is.EqualTo("en-US-posix")); + // Under Windows, it is named en-US-posix, but en-US-POSIX under Linux. + Assert.That(entity.ExtendedCulture.Name, Is.EqualTo("en-US-posix").IgnoreCase); Assert.That(entity.ExtendedCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US-posix"))); await (t.CommitAsync()); } diff --git a/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs b/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs index 7c7977941fe..d860c04ba1f 100644 --- a/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs @@ -9,10 +9,7 @@ namespace NHibernate.Test.TypesTest [TestFixture] public class CultureInfoTypeFixture : TypeFixtureBase { - protected override string TypeName - { - get { return "CultureInfo"; } - } + protected override string TypeName => "CultureInfo"; [Test] public void ReadWriteBasicCulture() @@ -75,7 +72,8 @@ public void ReadWriteExtendedCulture() { var entity = s.Get(id); Assert.That(entity.ExtendedCulture, Is.Not.Null); - Assert.That(entity.ExtendedCulture.Name, Is.EqualTo("en-US-posix")); + // Under Windows, it is named en-US-posix, but en-US-POSIX under Linux. + Assert.That(entity.ExtendedCulture.Name, Is.EqualTo("en-US-posix").IgnoreCase); Assert.That(entity.ExtendedCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US-posix"))); t.Commit(); } From 6d6eb282fcd3071b56ea34fba6d871e77001805d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= <12201973+fredericdelaporte@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:40:44 +0100 Subject: [PATCH 5/5] Update documentation about CultureInfoType --- doc/reference/modules/basic_mapping.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/reference/modules/basic_mapping.xml b/doc/reference/modules/basic_mapping.xml index 122def3f62f..2056bbe27a4 100644 --- a/doc/reference/modules/basic_mapping.xml +++ b/doc/reference/modules/basic_mapping.xml @@ -3919,7 +3919,8 @@ CultureInfo System.Globalization.CultureInfo - DbType.String - 5 chars for culture + DbType.String - 5 chars for culture by default; + can be modified by the length mapping attribute. Default when no type attribute specified.