|
1 | 1 | using System;
|
2 | 2 | using System.Linq;
|
| 3 | +using System.Text.RegularExpressions; |
3 | 4 | using NHibernate.DomainModel;
|
4 | 5 | using NHibernate.DomainModel.Northwind.Entities;
|
5 | 6 | using NHibernate.Linq;
|
@@ -114,17 +115,58 @@ where e.FirstName.Substring(0, 2) == "An"
|
114 | 115 | [Test]
|
115 | 116 | public void ReplaceFunction()
|
116 | 117 | {
|
| 118 | + var suppliedName = "Anne"; |
117 | 119 | var query = from e in db.Employees
|
118 | 120 | where e.FirstName.StartsWith("An")
|
119 | 121 | select new
|
120 |
| - { |
121 |
| - Before = e.FirstName, |
122 |
| - AfterMethod = e.FirstName.Replace("An", "Zan"), |
123 |
| - AfterExtension = ExtensionMethods.Replace(e.FirstName, "An", "Zan"), |
124 |
| - AfterExtension2 = e.FirstName.ReplaceExtension("An", "Zan") |
125 |
| - }; |
126 |
| - |
127 |
| - var s = ObjectDumper.Write(query); |
| 122 | + { |
| 123 | + Before = e.FirstName, |
| 124 | + // This one call the standard string.Replace, not the extension. The linq registry handles it. |
| 125 | + AfterMethod = e.FirstName.Replace("An", "Zan"), |
| 126 | + AfterExtension = ExtensionMethods.Replace(e.FirstName, "An", "Zan"), |
| 127 | + AfterNamedExtension = e.FirstName.ReplaceExtension("An", "Zan"), |
| 128 | + AfterEvaluableExtension = e.FirstName.ReplaceWithEvaluation("An", "Zan"), |
| 129 | + AfterEvaluable2Extension = e.FirstName.ReplaceWithEvaluation2("An", "Zan"), |
| 130 | + BeforeConst = suppliedName, |
| 131 | + // This one call the standard string.Replace, not the extension. The linq registry handles it. |
| 132 | + AfterMethodConst = suppliedName.Replace("An", "Zan"), |
| 133 | + AfterExtensionConst = ExtensionMethods.Replace(suppliedName, "An", "Zan"), |
| 134 | + AfterNamedExtensionConst = suppliedName.ReplaceExtension("An", "Zan"), |
| 135 | + AfterEvaluableExtensionConst = suppliedName.ReplaceWithEvaluation("An", "Zan"), |
| 136 | + AfterEvaluable2ExtensionConst = suppliedName.ReplaceWithEvaluation2("An", "Zan") |
| 137 | + }; |
| 138 | + var results = query.ToList(); |
| 139 | + var s = ObjectDumper.Write(results); |
| 140 | + |
| 141 | + foreach (var result in results) |
| 142 | + { |
| 143 | + var expectedDbResult = Regex.Replace(result.Before, "An", "Zan", RegexOptions.Compiled | RegexOptions.IgnoreCase); |
| 144 | + Assert.That(result.AfterMethod, Is.EqualTo(expectedDbResult), $"Wrong {nameof(result.AfterMethod)} value"); |
| 145 | + Assert.That(result.AfterExtension, Is.EqualTo(expectedDbResult), $"Wrong {nameof(result.AfterExtension)} value"); |
| 146 | + Assert.That(result.AfterNamedExtension, Is.EqualTo(expectedDbResult), $"Wrong {nameof(result.AfterNamedExtension)} value"); |
| 147 | + Assert.That(result.AfterEvaluableExtension, Is.EqualTo(expectedDbResult), $"Wrong {nameof(result.AfterEvaluableExtension)} value"); |
| 148 | + Assert.That(result.AfterEvaluable2Extension, Is.EqualTo(expectedDbResult), $"Wrong {nameof(result.AfterEvaluable2Extension)} value"); |
| 149 | + |
| 150 | + var expectedDbResultConst = Regex.Replace(result.BeforeConst, "An", "Zan", RegexOptions.Compiled | RegexOptions.IgnoreCase); |
| 151 | + var expectedInMemoryResultConst = result.BeforeConst.Replace("An", "Zan"); |
| 152 | + var expectedInMemoryExtensionResultConst = result.BeforeConst.ReplaceWithEvaluation("An", "Zan"); |
| 153 | + Assert.That(result.AfterMethodConst, Is.EqualTo(expectedInMemoryResultConst), $"Wrong {nameof(result.AfterMethodConst)} value"); |
| 154 | + Assert.That(result.AfterExtensionConst, Is.EqualTo(expectedDbResultConst), $"Wrong {nameof(result.AfterExtensionConst)} value"); |
| 155 | + Assert.That(result.AfterNamedExtensionConst, Is.EqualTo(expectedDbResultConst), $"Wrong {nameof(result.AfterNamedExtensionConst)} value"); |
| 156 | + Assert.That(result.AfterEvaluableExtensionConst, Is.EqualTo(expectedInMemoryExtensionResultConst), $"Wrong {nameof(result.AfterEvaluableExtensionConst)} value"); |
| 157 | + Assert.That(result.AfterEvaluable2ExtensionConst, Is.EqualTo(expectedInMemoryExtensionResultConst), $"Wrong {nameof(result.AfterEvaluable2ExtensionConst)} value"); |
| 158 | + } |
| 159 | + |
| 160 | + // Should cause ReplaceWithEvaluation to fail |
| 161 | + suppliedName = null; |
| 162 | + var failingQuery = from e in db.Employees |
| 163 | + where e.FirstName.StartsWith("An") |
| 164 | + select new |
| 165 | + { |
| 166 | + Before = e.FirstName, |
| 167 | + AfterEvaluableExtensionConst = suppliedName.ReplaceWithEvaluation("An", "Zan") |
| 168 | + }; |
| 169 | + Assert.That(() => failingQuery.ToList(), Throws.InstanceOf<HibernateException>().And.InnerException.InstanceOf<ArgumentNullException>()); |
128 | 170 | }
|
129 | 171 |
|
130 | 172 | [Test]
|
|
0 commit comments