You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2017/05/05 20:56:00 UTC

[5/9] lucenenet git commit: Renamed Lucene.Net.Icu > Lucene.Net.ICU, Lucene.Net.Tests.Icu > Lucene.Net.Tests.ICU

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/3c077fb1/src/Lucene.Net.Icu/Support/CharacterIterator.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Icu/Support/CharacterIterator.cs b/src/Lucene.Net.Icu/Support/CharacterIterator.cs
deleted file mode 100644
index 0c81629..0000000
--- a/src/Lucene.Net.Icu/Support/CharacterIterator.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-#if FEATURE_BREAKITERATOR
-using System;
-
-namespace Lucene.Net.Support
-{
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one or more
-     * contributor license agreements.  See the NOTICE file distributed with
-     * this work for additional information regarding copyright ownership.
-     * The ASF licenses this file to You under the Apache License, Version 2.0
-     * (the "License"); you may not use this file except in compliance with
-     * the License.  You may obtain a copy of the License at
-     *
-     *     http://www.apache.org/licenses/LICENSE-2.0
-     *
-     * Unless required by applicable law or agreed to in writing, software
-     * distributed under the License is distributed on an "AS IS" BASIS,
-     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     * See the License for the specific language governing permissions and
-     * limitations under the License.
-     */
-
-    public abstract class CharacterIterator
-    {
-        public static readonly char DONE = '\uFFFF';
-
-        public abstract char Current { get; }
-
-        public abstract char First();
-
-        public abstract char Last();
-
-        public abstract char Next();
-
-        public abstract char Previous();
-
-        public abstract char SetIndex(int position);
-
-        public abstract int BeginIndex { get; }
-
-        public abstract int EndIndex { get; }
-
-        public abstract int Index { get; }
-
-        public abstract object Clone();
-
-        public abstract string GetTextAsString();
-    }
-}
-#endif
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/3c077fb1/src/Lucene.Net.Icu/Support/IcuBreakIterator.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Icu/Support/IcuBreakIterator.cs b/src/Lucene.Net.Icu/Support/IcuBreakIterator.cs
deleted file mode 100644
index 79819ed..0000000
--- a/src/Lucene.Net.Icu/Support/IcuBreakIterator.cs
+++ /dev/null
@@ -1,394 +0,0 @@
-#if FEATURE_BREAKITERATOR
-using Lucene.Net.Support;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.Linq;
-using System.Text;
-
-namespace Lucene.Net
-{
-    /*
-	 * Licensed to the Apache Software Foundation (ASF) under one or more
-	 * contributor license agreements.  See the NOTICE file distributed with
-	 * this work for additional information regarding copyright ownership.
-	 * The ASF licenses this file to You under the Apache License, Version 2.0
-	 * (the "License"); you may not use this file except in compliance with
-	 * the License.  You may obtain a copy of the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS,
-	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-	 * See the License for the specific language governing permissions and
-	 * limitations under the License.
-	 */
-
-    /// <summary>
-    /// A <see cref="BreakIterator"/> implementation that encapsulates the functionality
-    /// of icu.net's <see cref="Icu.BreakIterator"/> static class. A <see cref="BreakIterator"/>
-    /// provides methods to move forward, reverse, and randomly through a set of text breaks
-    /// defined by the <see cref="Icu.BreakIterator.UBreakIteratorType"/> enumeration.
-    /// </summary>
-    // LUCENENET specific type
-    public class IcuBreakIterator : BreakIterator
-    {
-        private readonly Icu.Locale locale;
-        private readonly Icu.BreakIterator.UBreakIteratorType type;
-
-        private List<int> boundaries = new List<int>();
-        private int currentBoundaryIndex; // Index (not the value) of the current boundary in boundaries
-        private string text;
-
-        /// <summary>
-        /// The start offset for the string, if supplied by a <see cref="CharacterIterator"/>
-        /// </summary>
-        protected int m_start;
-
-        /// <summary>
-        /// The end offset for the string, if supplied by a <see cref="CharacterIterator"/>
-        /// </summary>
-        protected int m_end;
-
-        private bool enableHacks = false;
-
-        public IcuBreakIterator(Icu.BreakIterator.UBreakIteratorType type)
-            : this(type, CultureInfo.CurrentCulture)
-        {
-        }
-
-        public IcuBreakIterator(Icu.BreakIterator.UBreakIteratorType type, CultureInfo locale)
-        {
-            if (locale == null)
-                throw new ArgumentNullException("locale");
-            this.locale = new Icu.Locale(locale.Name);
-            this.type = type;
-        }
-
-        
-        public virtual bool EnableHacks
-        {
-            get { return enableHacks; }
-            set { enableHacks = value; }
-        }
-
-        /// <summary>
-        /// Sets the current iteration position to the beginning of the text.
-        /// </summary>
-        /// <returns>The offset of the beginning of the text.</returns>
-        public override int First()
-        {
-            currentBoundaryIndex = 0;
-            return ReturnCurrent();
-        }
-
-        /// <summary>
-        /// Sets the current iteration position to the end of the text.
-        /// </summary>
-        /// <returns>The text's past-the-end offset.</returns>
-        public override int Last()
-        {
-            currentBoundaryIndex = boundaries.Count - 1;
-            return ReturnCurrent();
-        }
-
-        /// <summary>
-        /// Advances the iterator either forward or backward the specified number of steps.
-        /// Negative values move backward, and positive values move forward.  This is
-        /// equivalent to repeatedly calling <see cref="Next()"/> or <see cref="Previous()"/>.
-        /// </summary>
-        /// <param name="n">The number of steps to move.  The sign indicates the direction
-        /// (negative is backwards, and positive is forwards).</param>
-        /// <returns>The character offset of the boundary position n boundaries away from
-        /// the current one.</returns>
-        public override int Next(int n)
-        {
-            int result = Current;
-            while (n > 0)
-            {
-                result = Next();
-                --n;
-            }
-            while (n < 0)
-            {
-                result = Previous();
-                ++n;
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// Advances the iterator to the next boundary position.
-        /// </summary>
-        /// <returns>The position of the first boundary after this one.</returns>
-        public override int Next()
-        {
-            if (currentBoundaryIndex >= boundaries.Count - 1 || boundaries.Count == 0)
-            {
-                return DONE;
-            }
-            currentBoundaryIndex++;
-            return ReturnCurrent();
-        }
-
-        /// <summary>
-        /// Advances the iterator backwards, to the last boundary preceding this one.
-        /// </summary>
-        /// <returns>The position of the last boundary position preceding this one.</returns>
-        public override int Previous()
-        {
-            if (currentBoundaryIndex == 0 || boundaries.Count == 0)
-            {
-                return DONE;
-            }
-            currentBoundaryIndex--;
-            return ReturnCurrent();
-        }
-
-        /// <summary>
-        /// Throw <see cref="ArgumentException"/> unless begin &lt;= offset &lt; end.
-        /// </summary>
-        /// <param name="offset"></param>
-        private void CheckOffset(int offset)
-        {
-            if (offset < m_start || offset > m_end)
-            {
-                throw new ArgumentException("offset out of bounds");
-            }
-        }
-
-        /// <summary>
-        /// Sets the iterator to refer to the first boundary position following
-        /// the specified position.
-        /// </summary>
-        /// <param name="offset">The position from which to begin searching for a break position.</param>
-        /// <returns>The position of the first break after the current position.</returns>
-        public override int Following(int offset)
-        {
-            CheckOffset(offset);
-
-            if (boundaries.Count == 0)
-            {
-                return DONE;
-            }
-
-            int following = GetLowestIndexGreaterThan(offset);
-            if (following == -1)
-            {
-                currentBoundaryIndex = boundaries.Count - 1;
-                return DONE;
-            }
-            else
-            {
-                currentBoundaryIndex = following;
-            }
-            return ReturnCurrent();
-        }
-
-        private int GetLowestIndexGreaterThan(int offset)
-        {
-            int index = boundaries.BinarySearch(offset);
-            if (index < 0)
-            {
-                return ~index;
-            }
-            else if (index + 1 < boundaries.Count)
-            {
-                return index + 1;
-            }
-
-            return -1;
-        }
-
-        /// <summary>
-        /// Sets the iterator to refer to the last boundary position before the
-        /// specified position.
-        /// </summary>
-        /// <param name="offset">The position to begin searching for a break from.</param>
-        /// <returns>The position of the last boundary before the starting position.</returns>
-        public override int Preceding(int offset)
-        {
-            CheckOffset(offset);
-
-            if (boundaries.Count == 0)
-            {
-                return DONE;
-            }
-
-            int preceeding = GetHighestIndexLessThan(offset);
-            if (preceeding == -1)
-            {
-                currentBoundaryIndex = 0;
-                return DONE;
-            }
-            else
-            {
-                currentBoundaryIndex = preceeding;
-            }
-            return ReturnCurrent();
-        }
-
-        private int GetHighestIndexLessThan(int offset)
-        {
-            int index = boundaries.BinarySearch(offset);
-            if (index < 0)
-            {
-                return ~index - 1;
-            }
-            else
-            {
-                // NOTE: This is intentionally allowed to return -1 in the case
-                // where index == 0. This state indicates we are before the first boundary.
-                return index - 1;
-            }
-        }
-
-        /// <summary>
-        /// Returns the current iteration position.
-        /// </summary>
-        public override int Current
-        {
-            get { return ReturnCurrent(); }
-        }
-
-        /// <summary>
-        /// Gets the text being analyzed.
-        /// </summary>
-        public override string Text
-        {
-            get
-            {
-                return text;
-            }
-        }
-
-        /// <summary>
-        /// Set the iterator to analyze a new piece of text.  This function resets
-        /// the current iteration position to the beginning of the text.
-        /// </summary>
-        /// <param name="newText">The text to analyze.</param>
-        public override void SetText(string newText)
-        {
-            text = newText;
-            currentBoundaryIndex = 0;
-            m_start = 0;
-            m_end = newText.Length;
-
-            LoadBoundaries(m_start, m_end);
-        }
-
-        public override void SetText(CharacterIterator newText)
-        {
-            text = newText.GetTextAsString();
-            currentBoundaryIndex = 0;
-            m_start = newText.BeginIndex;
-            m_end = newText.EndIndex;
-
-            LoadBoundaries(m_start, m_end);
-        }
-
-        private void LoadBoundaries(int start, int end)
-        {
-            IEnumerable<Icu.Boundary> icuBoundaries;
-            string offsetText = text.Substring(start, end - start);
-
-#if !NETSTANDARD
-            try
-            {
-#endif
-                if (type == Icu.BreakIterator.UBreakIteratorType.WORD)
-                {
-                    if (enableHacks)
-                    {
-                        // LUCENENET TODO: HACK - replacing hyphen with "a" so hyphenated words aren't broken
-                        offsetText = offsetText.Replace("-", "a");
-                    }
-
-                    icuBoundaries = Icu.BreakIterator.GetWordBoundaries(locale, offsetText, true);
-                }
-                else
-                {
-                    if (enableHacks && type == Icu.BreakIterator.UBreakIteratorType.SENTENCE)
-                    {
-                        // LUCENENET TODO: HACK - newline character causes incorrect sentence breaking.
-                        offsetText = offsetText.Replace("\n", " ");
-                        // LUCENENET TODO: HACK - the ICU sentence logic doesn't work (in English anyway) when sentences don't
-                        // begin with capital letters.
-                        offsetText = CapitalizeFirst(offsetText);
-                    }
-
-                    icuBoundaries = Icu.BreakIterator.GetBoundaries(type, locale, offsetText);
-                }
-#if !NETSTANDARD
-            }
-            catch (AccessViolationException ace)
-            {
-                // LUCENENET TODO: Find a reliable way to reproduce and report the 
-                // AccessViolationException that happens here to the icu-dotnet project team
-                throw new Exception("Hit AccessViolationException: " + ace.ToString(), ace);
-            }
-#endif
-
-            boundaries = icuBoundaries
-                .Select(t => new[] { t.Start + start, t.End + start })
-                .SelectMany(b => b)
-                .Distinct()
-                .ToList();
-        }
-
-        /// <summary>
-        /// Returns true if the specified character offset is a text boundary.
-        /// </summary>
-        /// <param name="offset">the character offset to check.</param>
-        /// <returns><c>true</c> if "offset" is a boundary position, <c>false</c> otherwise.</returns>
-        public override bool IsBoundary(int offset)
-        {
-            CheckOffset(offset);
-            return boundaries.Contains(offset);
-        }
-
-        private int ReturnCurrent()
-        {
-            if (boundaries.Count > 0)
-            {
-                return currentBoundaryIndex < boundaries.Count && currentBoundaryIndex > -1
-                    ? boundaries[currentBoundaryIndex]
-                    : DONE;
-            }
-
-            // If there are no boundaries, we must return the start offset
-            return m_start;
-        }
-
-        /// <summary>
-        /// LUCENENET TODO: This is a temporary workaround for an issue with icu-dotnet
-        /// where it doesn't correctly break sentences unless they begin with a capital letter.
-        /// If/when ICU is fixed, this method should be deleted and the IcuBreakIterator 
-        /// code changed to remove calls to this method.
-        /// </summary>
-        public static string CapitalizeFirst(string s)
-        {
-            bool isNewSentence = true;
-            var result = new StringBuilder(s.Length);
-            for (int i = 0; i < s.Length; i++)
-            {
-                if (isNewSentence && char.IsLetter(s[i]))
-                {
-                    result.Append(char.ToUpper(s[i]));
-                    isNewSentence = false;
-                }
-                else
-                    result.Append(s[i]);
-
-                if (s[i] == '!' || s[i] == '?' || s[i] == '.')
-                {
-                    isNewSentence = true;
-                }
-            }
-
-            return result.ToString();
-        }
-    }
-}
-#endif

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/3c077fb1/src/Lucene.Net.Icu/Support/StringCharacterIterator.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Icu/Support/StringCharacterIterator.cs b/src/Lucene.Net.Icu/Support/StringCharacterIterator.cs
deleted file mode 100644
index 156f81e..0000000
--- a/src/Lucene.Net.Icu/Support/StringCharacterIterator.cs
+++ /dev/null
@@ -1,204 +0,0 @@
-#if FEATURE_BREAKITERATOR
-using System;
-
-namespace Lucene.Net.Support
-{
-    /*
-     * Licensed to the Apache Software Foundation (ASF) under one or more
-     * contributor license agreements.  See the NOTICE file distributed with
-     * this work for additional information regarding copyright ownership.
-     * The ASF licenses this file to You under the Apache License, Version 2.0
-     * (the "License"); you may not use this file except in compliance with
-     * the License.  You may obtain a copy of the License at
-     *
-     *     http://www.apache.org/licenses/LICENSE-2.0
-     *
-     * Unless required by applicable law or agreed to in writing, software
-     * distributed under the License is distributed on an "AS IS" BASIS,
-     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     * See the License for the specific language governing permissions and
-     * limitations under the License.
-     */
-
-    /// <summary>
-    /// <see cref="StringCharacterIterator"/> implements the
-    /// <see cref="CharacterIterator"/> protocol for a <see cref="string"/>.
-    /// The <see cref="StringCharacterIterator"/> class iterates over the
-    /// entire <see cref="string"/>.
-    /// </summary>
-    /// <seealso cref="CharacterIterator"/>
-    public class StringCharacterIterator : CharacterIterator
-    {
-        private string text;
-        private int begin;
-        private int end;
-        // invariant: begin <= pos <= end
-        private int pos;
-
-
-        public StringCharacterIterator(string text)
-            : this(text, 0)
-        {
-        }
-
-        public StringCharacterIterator(string text, int pos)
-            : this(text, 0, text.Length, pos)
-        {
-        }
-
-        public StringCharacterIterator(string text, int begin, int end, int pos)
-        {
-            if (text == null)
-                throw new ArgumentNullException("text");
-            this.text = text;
-
-            if (begin < 0 || begin > end || end > text.Length)
-                throw new ArgumentException("Invalid substring range");
-
-            if (pos < begin || pos > end)
-                throw new ArgumentException("Invalid position");
-
-            this.begin = begin;
-            this.end = end;
-            this.pos = pos;
-        }
-
-        public void SetText(string text)
-        {
-            if (text == null)
-                throw new ArgumentNullException("text");
-            this.text = text;
-            this.begin = 0;
-            this.end = text.Length;
-            this.pos = 0;
-        }
-
-        public override char First()
-        {
-            pos = begin;
-            return Current;
-        }
-
-        public override char Last()
-        {
-            if (end != begin)
-            {
-                pos = end - 1;
-            }
-            else
-            {
-                pos = end;
-            }
-            return Current;
-        }
-
-        public override char SetIndex(int position)
-        {
-            if (position < begin || position > end)
-                throw new ArgumentException("Invalid index");
-            pos = position;
-            return Current;
-        }
-
-        public override char Current
-        {
-            get
-            {
-                if (pos >= begin && pos < end)
-                {
-                    return text[pos];
-                }
-                else
-                {
-                    return DONE;
-                }
-            }
-        }
-
-        public override char Next()
-        {
-            if (pos < end - 1)
-            {
-                pos++;
-                return text[pos];
-            }
-            else
-            {
-                pos = end;
-                return DONE;
-            }
-        }
-
-        public override char Previous()
-        {
-            if (pos > begin)
-            {
-                pos--;
-                return text[pos];
-            }
-            else
-            {
-                return DONE;
-            }
-        }
-
-
-        public override int BeginIndex
-        {
-            get
-            {
-                return begin;
-            }
-        }
-
-        public override int EndIndex
-        {
-            get
-            {
-                return end;
-            }
-        }
-
-        public override int Index
-        {
-            get
-            {
-                return pos;
-            }
-        }
-
-        public override string GetTextAsString()
-        {
-            return text;
-        }
-
-        public override bool Equals(object obj)
-        {
-            if (this == obj)
-                return true;
-            if (!(obj is StringCharacterIterator))
-            return false;
-
-            StringCharacterIterator that = (StringCharacterIterator)obj;
-
-            if (GetHashCode() != that.GetHashCode())
-                return false;
-            if (!text.Equals(that.text, StringComparison.Ordinal))
-                return false;
-            if (pos != that.pos || begin != that.begin || end != that.end)
-                return false;
-            return true;
-        }
-
-        public override int GetHashCode()
-        {
-            return base.GetHashCode() ^ pos ^ begin ^ end;
-        }
-
-        public override object Clone()
-        {
-            return MemberwiseClone();
-        }
-    }
-}
-#endif

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/3c077fb1/src/Lucene.Net.Icu/project.json
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Icu/project.json b/src/Lucene.Net.Icu/project.json
deleted file mode 100644
index c75310e..0000000
--- a/src/Lucene.Net.Icu/project.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "version": "4.8.0",
-  "title": "Lucene.Net.Icu",
-  "description": "International Components for Unicode-based features including Thai analyzer support, an international postings highlighter, and BreakIterator support for the vector highlighter for the Lucene.Net full-text search engine library from The Apache Software Foundation.",
-  "authors": [ "The Apache Software Foundation" ],
-  "packOptions": {
-    "projectUrl": "http://lucenenet.apache.org/",
-    "licenseUrl": "https://github.com/apache/lucenenet/blob/master/LICENSE.txt",
-    "iconUrl": "https://github.com/apache/lucenenet/blob/master/branding/logo/lucene-net-icon-128x128.png?raw=true",
-    "owners": [ "The Apache Software Foundation" ],
-    "repository": { "url": "https://github.com/apache/lucenenet" },
-    "tags": [ "lucene.net", "core", "text", "search", "information", "retrieval", "lucene", "apache", "analysis", "index", "query" ]
-  },
-  "buildOptions": {
-    "define": [ "FEATURE_BREAKITERATOR" ],
-    "compile": {
-      "includeFiles": [
-        "../CommonAssemblyInfo.cs",
-        "../Lucene.Net.Analysis.Common/Analysis/Th/ThaiAnalyzer.cs",
-        "../Lucene.Net.Analysis.Common/Analysis/Th/ThaiTokenizer.cs",
-        "../Lucene.Net.Analysis.Common/Analysis/Th/ThaiTokenizerFactory.cs",
-        "../Lucene.Net.Analysis.Common/Analysis/Th/ThaiWordFilter.cs",
-        "../Lucene.Net.Analysis.Common/Analysis/Th/ThaiWordFilterFactory.cs",
-        "../Lucene.Net.Analysis.Common/Analysis/Util/CharArrayIterator.cs",
-        "../Lucene.Net.Analysis.Common/Analysis/Util/SegmentingTokenizerBase.cs",
-        "../Lucene.Net.Highlighter/PostingsHighlight/DefaultPassageFormatter.cs",
-        "../Lucene.Net.Highlighter/PostingsHighlight/MultiTermHighlighting.cs",
-        "../Lucene.Net.Highlighter/PostingsHighlight/Passage.cs",
-        "../Lucene.Net.Highlighter/PostingsHighlight/PassageFormatter.cs",
-        "../Lucene.Net.Highlighter/PostingsHighlight/PassageScorer.cs",
-        "../Lucene.Net.Highlighter/PostingsHighlight/PostingsHighlighter.cs",
-        "../Lucene.Net.Highlighter/PostingsHighlight/WholeBreakIterator.cs",
-        "../Lucene.Net.Highlighter/VectorHighlight/BreakIteratorBoundaryScanner.cs"
-      ]
-    },
-    "embed": {
-      "includeFiles": [ "Analysis/Th/stopwords.txt" ]
-    }
-  },
-  "dependencies": {
-    "icu.net": "54.1.1-alpha",
-    "Lucene.Net": "4.8.0",
-    "Lucene.Net.Analysis.Common": "4.8.0",
-    "Lucene.Net.Highlighter": "4.8.0"
-  },
-  "frameworks": {
-    "netstandard1.5": {
-      "imports": "dnxcore50",
-      "buildOptions": {
-        "debugType": "portable",
-        "define": [ "NETSTANDARD" ]
-      },
-      "dependencies": {
-        "NETStandard.Library": "1.6.0"
-      }
-    },
-    "net451": {
-      "buildOptions": {
-        "debugType": "full",
-        "define": [ "FEATURE_SERIALIZABLE" ]
-      }
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/3c077fb1/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.csproj
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.csproj b/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.csproj
new file mode 100644
index 0000000..84d660a
--- /dev/null
+++ b/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.csproj
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{D5AA1A22-1B28-4DF6-BFDA-02519A189839}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Lucene.Net</RootNamespace>
+    <AssemblyName>Lucene.Net.Tests.ICU</AssemblyName>
+    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <DefineConstants>$(DefineConstants);FEATURE_BREAKITERATOR;FEATURE_SERIALIZABLE</DefineConstants>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\Lucene.Net.Tests.Analysis.Common\Analysis\Th\TestThaiAnalyzer.cs">
+      <Link>Analysis\Th\TestThaiAnalyzer.cs</Link>
+    </Compile>
+    <Compile Include="..\Lucene.Net.Tests.Analysis.Common\Analysis\Th\TestThaiTokenizerFactory.cs">
+      <Link>Analysis\Th\TestThaiTokenizerFactory.cs</Link>
+    </Compile>
+    <Compile Include="..\Lucene.Net.Tests.Analysis.Common\Analysis\Th\TestThaiWordFilterFactory.cs">
+      <Link>Analysis\Th\TestThaiWordFilterFactory.cs</Link>
+    </Compile>
+    <Compile Include="..\Lucene.Net.Tests.Analysis.Common\Analysis\Util\TestCharArrayIterator.cs">
+      <Link>Analysis\Util\TestCharArrayIterator.cs</Link>
+    </Compile>
+    <Compile Include="..\Lucene.Net.Tests.Analysis.Common\Analysis\Util\TestSegmentingTokenizerBase.cs">
+      <Link>Analysis\Util\TestSegmentingTokenizerBase.cs</Link>
+    </Compile>
+    <Compile Include="..\Lucene.Net.Tests.Highlighter\PostingsHighlight\TestMultiTermHighlighting.cs">
+      <Link>Search\PostingsHighlight\TestMultiTermHighlighting.cs</Link>
+    </Compile>
+    <Compile Include="..\Lucene.Net.Tests.Highlighter\PostingsHighlight\TestPostingsHighlighter.cs">
+      <Link>Search\PostingsHighlight\TestPostingsHighlighter.cs</Link>
+    </Compile>
+    <Compile Include="..\Lucene.Net.Tests.Highlighter\PostingsHighlight\TestPostingsHighlighterRanking.cs">
+      <Link>Search\PostingsHighlight\TestPostingsHighlighterRanking.cs</Link>
+    </Compile>
+    <Compile Include="..\Lucene.Net.Tests.Highlighter\PostingsHighlight\TestWholeBreakIterator.cs">
+      <Link>Search\PostingsHighlight\TestWholeBreakIterator.cs</Link>
+    </Compile>
+    <Compile Include="..\Lucene.Net.Tests.Highlighter\VectorHighlight\BreakIteratorBoundaryScannerTest.cs">
+      <Link>Search\VectorHighlight\BreakIteratorBoundaryScannerTest.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Support\TestApiConsistency.cs" />
+    <Compile Include="Support\TestExceptionSerialization.cs" />
+    <Compile Include="Support\TestIcuBreakIterator.cs" />
+    <Compile Include="..\CommonAssemblyInfo.cs">
+      <Link>Properties\CommonAssemblyInfo.cs</Link>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Lucene.Net.Analysis.Common\Lucene.Net.Analysis.Common.csproj">
+      <Project>{4add0bbc-b900-4715-9526-d871de8eea64}</Project>
+      <Name>Lucene.Net.Analysis.Common</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Lucene.Net.Highlighter\Lucene.Net.Highlighter.csproj">
+      <Project>{e9e769ea-8504-44bc-8dc9-ccf958765f8f}</Project>
+      <Name>Lucene.Net.Highlighter</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Lucene.Net.ICU\Lucene.Net.ICU.csproj">
+      <Project>{349cb7c9-7534-4e1d-9b0a-5521441af0ae}</Project>
+      <Name>Lucene.Net.ICU</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Lucene.Net.TestFramework\Lucene.Net.TestFramework.csproj">
+      <Project>{b2c0d749-ce34-4f62-a15e-00cb2ff5ddb3}</Project>
+      <Name>Lucene.Net.TestFramework</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Lucene.Net.Tests.Analysis.Common\Lucene.Net.Tests.Analysis.Common.csproj">
+      <Project>{c54fe8fa-7986-4c94-b872-d5bff7c6c74e}</Project>
+      <Name>Lucene.Net.Tests.Analysis.Common</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Lucene.Net\Lucene.Net.csproj">
+      <Project>{5d4ad9be-1ffb-41ab-9943-25737971bf57}</Project>
+      <Name>Lucene.Net</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Lucene.Net.Tests.ICU.project.json" />
+    <EmbeddedResource Include="Search\PostingsHighlight\CambridgeMA.utf8" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/3c077fb1/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.project.json
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.project.json b/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.project.json
new file mode 100644
index 0000000..2a96d5b
--- /dev/null
+++ b/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.project.json
@@ -0,0 +1,12 @@
+{
+  "runtimes": {
+    "win": {}
+  },
+  "dependencies": {
+    "NUnit": "3.5.0",
+    "icu.net": "54.1.1-alpha"
+  },
+  "frameworks": {
+    "net451": {}
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/3c077fb1/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.xproj
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.xproj b/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.xproj
new file mode 100644
index 0000000..7663a09
--- /dev/null
+++ b/src/Lucene.Net.Tests.ICU/Lucene.Net.Tests.ICU.xproj
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+  </PropertyGroup>
+  <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>32fd3471-e862-4055-b969-79c12a656366</ProjectGuid>
+    <RootNamespace>Lucene.Net</RootNamespace>
+    <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
+    <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
+    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SchemaVersion>2.0</SchemaVersion>
+  </PropertyGroup>
+  <ItemGroup>
+    <Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
+  </ItemGroup>
+  <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
+</Project>

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/3c077fb1/src/Lucene.Net.Tests.ICU/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Tests.ICU/Properties/AssemblyInfo.cs b/src/Lucene.Net.Tests.ICU/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..dfa32ab
--- /dev/null
+++ b/src/Lucene.Net.Tests.ICU/Properties/AssemblyInfo.cs
@@ -0,0 +1,42 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Lucene.Net.Tests.ICU")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("d5aa1a22-1b28-4df6-bfda-02519a189839")]
+
+// NOTE: Version information is in CommonAssemblyInfo.cs