// OpenTween - Client of Twitter // Copyright (c) 2013 kim_upsilon (@kim_upsilon) // All rights reserved. // // This file is part of OpenTween. // // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 3 of the License, or (at your option) // any later version. // // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License along // with this program. If not, see , or write to // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, // Boston, MA 02110-1301, USA. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Xunit; using Xunit.Extensions; namespace OpenTween { public class PostFilterRuleTest { public PostFilterRuleTest() { PostFilterRule.AutoCompile = true; } [Fact] public void EmptyRuleTest() { var filter = new PostFilterRule { }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); } [Fact] public void NullTest() { var filter = new PostFilterRule { FilterName = null, FilterSource = null, ExFilterName = null, ExFilterSource = null, }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); Assert.Throws(() => filter.FilterBody = null); Assert.Throws(() => filter.ExFilterBody = null); } [Fact] public void MatchOnlyTest() { var filter = new PostFilterRule { FilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExcludeOnlyTest() { var filter = new PostFilterRule { ExFilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void MatchAndExcludeTest() { var filter = new PostFilterRule { FilterName = "hogehoge", ExFilterSource = "tetete" }; var post = new PostClass { ScreenName = "hogehoge", Source = "tetete" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); } [Fact] public void PostMatchOptions_CopyTest() { var filter = new PostFilterRule { FilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; filter.MoveMatches = false; filter.MarkMatches = false; Assert.Equal(MyCommon.HITRESULT.Copy, filter.ExecFilter(post)); } [Fact] public void PostMatchOptions_CopyAndMarkTest() { var filter = new PostFilterRule { FilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; filter.MoveMatches = false; filter.MarkMatches = true; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void PostMatchOptions_MoveTest() { var filter = new PostFilterRule { FilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; filter.MoveMatches = true; filter.MarkMatches = false; // 無視される Assert.Equal(MyCommon.HITRESULT.Move, filter.ExecFilter(post)); filter.MoveMatches = true; filter.MarkMatches = true; // 無視される Assert.Equal(MyCommon.HITRESULT.Move, filter.ExecFilter(post)); } [Fact] public void FilterName_Test() { var filter = new PostFilterRule(); PostClass post; filter.FilterName = "hogehoge"; post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterName は RetweetedBy にもマッチする post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterName は完全一致 (UseRegex = false の場合) post = new PostClass { ScreenName = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterName_Test() { var filter = new PostFilterRule(); PostClass post; filter.ExFilterName = "hogehoge"; post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterName は RetweetedBy にもマッチする post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterName は完全一致 (ExUseRegex = false の場合) post = new PostClass { ScreenName = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterName_RegexTest() { var filter = new PostFilterRule(); PostClass post; filter.UseRegex = true; filter.FilterName = "(hoge){2}"; post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterName は RetweetedBy にもマッチする post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterName は部分一致 (UseRegex = true の場合) post = new PostClass { ScreenName = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterName_RegexTest() { var filter = new PostFilterRule(); PostClass post; filter.ExUseRegex = true; filter.ExFilterName = "(hoge){2}"; post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterName は RetweetedBy にもマッチする post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterName は部分一致 (ExUseRegex = true の場合) post = new PostClass { ScreenName = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterBody_Test() { var filter = new PostFilterRule(); PostClass post; filter.FilterBody = new[] { "aaa", "bbb" }; post = new PostClass { TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の文字列が全て含まれている post = new PostClass { TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // ScreenName にはマッチしない (UseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterBody_Test() { var filter = new PostFilterRule(); PostClass post; filter.ExFilterBody = new[] { "aaa", "bbb" }; post = new PostClass { TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の文字列が全て含まれている post = new PostClass { TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName にはマッチしない (ExUseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterBody_RegexTest() { var filter = new PostFilterRule(); PostClass post; filter.UseRegex = true; filter.FilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の文字列が全て含まれている post = new PostClass { TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // ScreenName にはマッチしない (UseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterBody_RegexTest() { var filter = new PostFilterRule(); PostClass post; filter.ExUseRegex = true; filter.ExFilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の文字列が全て含まれている post = new PostClass { TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName にはマッチしない (ExUseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterBody_ByUrlTest() { var filter = new PostFilterRule(); PostClass post; // FilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.FilterByUrl = true; filter.FilterBody = new[] { "aaa", "bbb" }; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の文字列が全て含まれている post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // ScreenName にはマッチしない (UseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterBody_ByUrlTest() { var filter = new PostFilterRule(); PostClass post; // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.ExFilterByUrl = true; filter.ExFilterBody = new[] { "aaa", "bbb" }; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の文字列が全て含まれている post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName にはマッチしない (ExUseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterBody_ByUrlRegexTest() { var filter = new PostFilterRule(); PostClass post; // FilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.FilterByUrl = true; filter.UseRegex = true; filter.FilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の文字列が全て含まれている post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // ScreenName にはマッチしない (UseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterBody_ByUrlRegexTest() { var filter = new PostFilterRule(); PostClass post; // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.ExFilterByUrl = true; filter.ExUseRegex = true; filter.ExFilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の文字列が全て含まれている post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName にはマッチしない (ExUseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterBodyAndName_Test() { var filter = new PostFilterRule(); PostClass post; // UseNameField = false の場合は FilterBody のマッチ対象が TextFromApi と ScreenName の両方になる filter.UseNameField = false; filter.FilterBody = new[] { "aaa", "bbb" }; post = new PostClass { ScreenName = "hoge", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // TextFromApi に FilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // TextFromApi と ScreenName に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // TextFromApi と RetweetedBy に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "bbb", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // ScreenName に対しては完全一致 (UseRegex = false の場合) post = new PostClass { ScreenName = "_aaa_", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // TextFromApi に対しては UseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", TextFromApi = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterBodyAndName_Test() { var filter = new PostFilterRule(); PostClass post; // ExUseNameField = false の場合は ExFilterBody のマッチ対象が TextFromApi と ScreenName の両方になる filter.ExUseNameField = false; filter.ExFilterBody = new[] { "aaa", "bbb" }; post = new PostClass { ScreenName = "hoge", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // TextFromApi に ExFilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // TextFromApi と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // TextFromApi と RetweetedBy に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "bbb", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName に対しては完全一致 (ExUseRegex = false の場合) post = new PostClass { ScreenName = "_aaa_", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // TextFromApi に対しては ExUseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", TextFromApi = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterBodyAndName_RegexTest() { var filter = new PostFilterRule(); PostClass post; // UseNameField = false の場合は FilterBody のマッチ対象が TextFromApi と ScreenName の両方になる filter.UseNameField = false; filter.UseRegex = true; filter.FilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { ScreenName = "hoge", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // TextFromApi に FilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // TextFromApi と ScreenName に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // TextFromApi と RetweetedBy に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "bbb", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // ScreenName に対しても部分一致 (UseRegex = true の場合) post = new PostClass { ScreenName = "_aaa_", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // TextFromApi に対しては UseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", TextFromApi = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterBodyAndName_RegexTest() { var filter = new PostFilterRule(); PostClass post; // ExUseNameField = false の場合は ExFilterBody のマッチ対象が TextFromApi と ScreenName の両方になる filter.ExUseNameField = false; filter.ExUseRegex = true; filter.ExFilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { ScreenName = "hoge", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // TextFromApi に ExFilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // TextFromApi と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // TextFromApi と RetweetedBy に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "bbb", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName に対しても部分一致 (ExUseRegex = true の場合) post = new PostClass { ScreenName = "_aaa_", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // TextFromApi に対しては ExUseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", TextFromApi = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterBodyAndName_ByUrlTest() { var filter = new PostFilterRule(); PostClass post; // FilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.FilterByUrl = true; // UseNameField = false の場合は FilterBody のマッチ対象が Text と ScreenName の両方になる filter.UseNameField = false; filter.FilterBody = new[] { "aaa", "bbb" }; post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // Text に FilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // Text と ScreenName に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // Text と ScreenName に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // ScreenName に対しては完全一致 (UseRegex = false の場合) post = new PostClass { ScreenName = "_aaa_", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // Text に対しては UseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", Text = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { ScreenName = "Aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { ScreenName = "Aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterBodyAndName_ByUrlTest() { var filter = new PostFilterRule(); PostClass post; // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.ExFilterByUrl = true; // ExUseNameField = false の場合は ExFilterBody のマッチ対象が Text と ScreenName の両方になる filter.ExUseNameField = false; filter.ExFilterBody = new[] { "aaa", "bbb" }; post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // Text に ExFilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName に対しては完全一致 (ExUseRegex = false の場合) post = new PostClass { ScreenName = "_aaa_", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // Text に対しては ExUseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", Text = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { ScreenName = "Aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "Aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterBodyAndName_ByUrlRegexTest() { var filter = new PostFilterRule(); PostClass post; // FilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.FilterByUrl = true; // UseNameField = false の場合は FilterBody のマッチ対象が Text と ScreenName の両方になる filter.UseNameField = false; filter.UseRegex = true; filter.FilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // Text に FilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // Text と ScreenName に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // Text と ScreenName に FilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // ScreenName に対しても部分一致 (UseRegex = true の場合) post = new PostClass { ScreenName = "_aaa_", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // Text に対しては UseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", Text = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { ScreenName = "Aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { ScreenName = "Aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterBodyAndName_ByUrlRegexTest() { var filter = new PostFilterRule(); PostClass post; // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.ExFilterByUrl = true; // ExUseNameField = false の場合は ExFilterBody のマッチ対象が Text と ScreenName の両方になる filter.ExUseNameField = false; filter.ExUseRegex = true; filter.ExFilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // Text に ExFilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", Text = "t.co/hoge", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName に対しても部分一致 (ExUseRegex = true の場合) post = new PostClass { ScreenName = "_aaa_", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // Text に対しては ExUseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", Text = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { ScreenName = "Aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "Aaa", Text = "t.co/hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "t.co/hoge", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterSource_Test() { var filter = new PostFilterRule(); PostClass post; filter.FilterSource = "hogehoge"; post = new PostClass { Source = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { Source = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterSource は完全一致 (UseRegex = false の場合) post = new PostClass { Source = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { Source = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { Source = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterSource_Test() { var filter = new PostFilterRule(); PostClass post; filter.ExFilterSource = "hogehoge"; post = new PostClass { Source = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { Source = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterSource は完全一致 (ExUseRegex = false の場合) post = new PostClass { Source = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { Source = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { Source = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterSource_RegexTest() { var filter = new PostFilterRule(); PostClass post; filter.UseRegex = true; filter.FilterSource = "(hoge){2}"; post = new PostClass { Source = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { Source = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterSource は部分一致 (UseRegex = true の場合) post = new PostClass { Source = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { Source = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { Source = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterSource_RegexTest() { var filter = new PostFilterRule(); PostClass post; filter.ExUseRegex = true; filter.ExFilterSource = "(hoge){2}"; post = new PostClass { Source = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { Source = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterSource は部分一致 (ExUseRegex = true の場合) post = new PostClass { Source = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { Source = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { Source = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterSource_ByUrlTest() { var filter = new PostFilterRule(); PostClass post; // FilterByUrl = true の場合は Source ではなく SourceHtml がマッチ対象になる filter.FilterByUrl = true; filter.FilterSource = "hogehoge"; // FilterSource は UseRegex の値に関わらず部分一致 post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterSource_ByUrlTest() { var filter = new PostFilterRule(); PostClass post; // ExFilterByUrl = true の場合は Source ではなく SourceHtml がマッチ対象になる filter.ExFilterByUrl = true; filter.ExFilterSource = "hogehoge"; // ExFilterSource は ExUseRegex の値に関わらず部分一致 post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterSource_ByUrlRegexTest() { var filter = new PostFilterRule(); PostClass post; // FilterByUrl = true の場合は Source ではなく SourceHtml がマッチ対象になる filter.FilterByUrl = true; filter.UseRegex = true; filter.FilterSource = "(hoge){2}"; // FilterSource は UseRegex の値に関わらず部分一致 post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); } [Fact] public void ExFilterSource_ByUrlRegexTest() { var filter = new PostFilterRule(); PostClass post; // ExFilterByUrl = true の場合は Source ではなく SourceHtml がマッチ対象になる filter.ExFilterByUrl = true; filter.ExUseRegex = true; filter.ExFilterSource = "(hoge){2}"; // ExFilterSource は ExUseRegex の値に関わらず部分一致 post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { SourceHtml = "****" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); } [Fact] public void FilterRt_Test() { var filter = new PostFilterRule(); PostClass post; filter.FilterRt = true; post = new PostClass { RetweetedBy = "hogehoge", RetweetedId = 123L }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); } [Fact] public void ExFilterRt_Test() { var filter = new PostFilterRule(); PostClass post; filter.ExFilterRt = true; post = new PostClass { RetweetedBy = "hogehoge", RetweetedId = 123L }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); } } }