This is an automated email from the ASF dual-hosted git repository. nightowl888 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/lucenenet.git
commit 7f69810240e32cfc73bcbf53a63b8a8fbf2ade1b Author: Shad Storhaug <[email protected]> AuthorDate: Sun Jul 28 17:19:13 2019 +0700 BUG: Lucene.Net.Suggest.Suggest.FileDictionary - Fixed conversion of string to number to be culture insensitive (it caused the tests in FileDictionaryTest to fail randomly) --- src/Lucene.Net.Suggest/Suggest/FileDictionary.cs | 21 ++++++++++++++------- .../Suggest/FileDictionaryTest.cs | 22 ++++++++++++---------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/Lucene.Net.Suggest/Suggest/FileDictionary.cs b/src/Lucene.Net.Suggest/Suggest/FileDictionary.cs index 0928676..cdcb9dc 100644 --- a/src/Lucene.Net.Suggest/Suggest/FileDictionary.cs +++ b/src/Lucene.Net.Suggest/Suggest/FileDictionary.cs @@ -2,6 +2,7 @@ using Lucene.Net.Util; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Text; @@ -255,14 +256,20 @@ namespace Lucene.Net.Search.Suggest internal void ReadWeight(string weight) { - // keep reading floats for bw compat - try + // LUCENENET specific - don't use exception, use TryParse + if (!long.TryParse(weight, NumberStyles.Integer, CultureInfo.InvariantCulture, out curWeight)) { - curWeight = Convert.ToInt64(weight); - } - catch (FormatException) - { - curWeight = (long)Convert.ToDouble(weight); + try + { + // keep reading floats for bw compat + curWeight = (long)double.Parse(weight, NumberStyles.Float, CultureInfo.InvariantCulture); + } + catch (FormatException e) + { + // LUCENENET TODO: This is just so we can see what string and what culture was being tested when parsing failed, + // to try to reproduce the conditions of the failure. + throw new FormatException($"Weight '{weight}' could not be parsed to long or double in culture '{CultureInfo.CurrentCulture.Name}'.", e); + } } } diff --git a/src/Lucene.Net.Tests.Suggest/Suggest/FileDictionaryTest.cs b/src/Lucene.Net.Tests.Suggest/Suggest/FileDictionaryTest.cs index cbdf5f8..74ec357 100644 --- a/src/Lucene.Net.Tests.Suggest/Suggest/FileDictionaryTest.cs +++ b/src/Lucene.Net.Tests.Suggest/Suggest/FileDictionaryTest.cs @@ -32,24 +32,26 @@ namespace Lucene.Net.Search.Suggest List<string> entryValues = new List<string>(); StringBuilder sb = new StringBuilder(); string term = TestUtil.RandomSimpleString(Random(), 1, 300); - sb.append(term); + sb.Append(term); entryValues.Add(term); if (hasWeight) { - sb.append(fieldDelimiter); + sb.Append(fieldDelimiter); long weight = TestUtil.NextLong(Random(), long.MinValue, long.MaxValue); - sb.append(weight); - entryValues.Add(weight.ToString()); + // LUCENENET: We need to explicitly use invariant culture here, + // as that is what is expected in Java + sb.Append(weight.ToString(CultureInfo.InvariantCulture)); + entryValues.Add(weight.ToString(CultureInfo.InvariantCulture)); } if (hasPayload) { - sb.append(fieldDelimiter); + sb.Append(fieldDelimiter); string payload = TestUtil.RandomSimpleString(Random(), 1, 300); - sb.append(payload); + sb.Append(payload); entryValues.Add(payload); } sb.append("\n"); - return new KeyValuePair<List<string>, string>(entryValues, sb.toString()); + return new KeyValuePair<List<string>, string>(entryValues, sb.ToString()); } private KeyValuePair<List<List<string>>, string> generateFileInput(int count, string fieldDelimiter, bool hasWeights, bool hasPayloads) @@ -65,9 +67,9 @@ namespace Lucene.Net.Search.Suggest } KeyValuePair<List<string>, string> entrySet = GenerateFileEntry(fieldDelimiter, (!hasPayloads && hasWeights) ? Random().nextBoolean() : hasWeights, hasPayload); entries.Add(entrySet.Key); - sb.append(entrySet.Value); + sb.Append(entrySet.Value); } - return new KeyValuePair<List<List<string>>, string>(entries, sb.toString()); + return new KeyValuePair<List<List<string>>, string>(entries, sb.ToString()); } [Test] @@ -198,7 +200,7 @@ namespace Lucene.Net.Search.Suggest List<string> entry = entries[count]; assertTrue(entry.size() >= 2); // at least term and weight assertEquals(entry[0], term.Utf8ToString()); - assertEquals(long.Parse(entry[1]), inputIter.Weight); + assertEquals(long.Parse(entry[1], CultureInfo.InvariantCulture), inputIter.Weight); if (entry.size() == 3) { assertEquals(entry[2], inputIter.Payload.Utf8ToString());
