public void EmptyRuleTest() { var filter = new PostFilterRule { }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); }
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<ArgumentNullException>(() => filter.FilterBody = null); Assert.Throws<ArgumentNullException>(() => filter.ExFilterBody = null); }
public void FieldNullAwareTest() { var nullPost = new PostClass { Source = null }; // Source が null であっても ArgumentNullException 等を投げない var filter1 = new PostFilterRule { FilterSource = "(hoge){2}", UseRegex = true, }; Assert.Equal(MyCommon.HITRESULT.None, filter1.ExecFilter(nullPost)); // null は空文字列と同じ扱いにする var filter2 = new PostFilterRule { FilterSource = "^$", UseRegex = true, }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter2.ExecFilter(nullPost)); }
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)); }
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)); }
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)); }
public void RemoveFilter(PostFilterRule filter) { lock (this.lockObjFilters) { _filters.Remove(filter); filter.PropertyChanged -= this.OnFilterModified; this.FilterModified = true; } }
public void ExcludeOnlyTest() { var filter = new PostFilterRule { ExFilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
public void RemoveFilter_Test() { var tab = new FilterTabModel("MyTab"); var filter = new PostFilterRule(); tab.FilterArray = new[] { filter }; tab.FilterModified = false; tab.RemoveFilter(filter); Assert.Empty(tab.FilterArray); Assert.True(tab.FilterModified); }
public void Equals_HasNoExcludeConditionsTest() { var filter1 = new PostFilterRule { // マッチ条件 FilterName = "name", // 除外条件 ExFilterName = "", ExCaseSensitive = true, }; var filter2 = new PostFilterRule { FilterName = "name", ExFilterName = "", ExCaseSensitive = false, }; // 除外条件が無いので ExCaseSensitive 等の差異は無視する Assert.True(filter1.Equals(filter2)); Assert.True(filter2.Equals(filter1)); }
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)); }
public void Equals_HasNoMatchConditionsTest() { var filter1 = new PostFilterRule { // マッチ条件 FilterName = "", CaseSensitive = true, // 除外条件 ExFilterName = "nameEx", }; var filter2 = new PostFilterRule { FilterName = "", CaseSensitive = false, ExFilterName = "nameEx", }; // マッチ条件 (≠除外条件) が無いので CaseSensitive 等の差異は無視する Assert.True(filter1.Equals(filter2)); Assert.True(filter2.Equals(filter1)); }
public void Disabled_Test() { var filter = new PostFilterRule { FilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; filter.Enabled = false; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); }
public void Equals_Test() { var filter1 = new PostFilterRule { FilterName = "name", FilterBody = new[] { "body" }, FilterSource = "source", ExFilterName = "nameEx", ExFilterBody = new[] { "bodyEx" }, ExFilterSource = "sourceEx", }; var filter2 = new PostFilterRule { FilterName = "name", FilterBody = new[] { "body" }, FilterSource = "source", ExFilterName = "nameEx", ExFilterBody = new[] { "bodyEx" }, ExFilterSource = "sourceEx", }; Assert.True(filter1.Equals(filter2)); Assert.True(filter2.Equals(filter1)); }
public void SetProperty_SameValueTest() { var filter = new PostFilterRule(); filter.FilterName = "hogehoge"; filter.Compile(); string changedPropeyty = null; // 値に変化がないので PropertyChanged イベントは発生しない filter.PropertyChanged += (_, x) => changedPropeyty = x.PropertyName; filter.FilterName = "hogehoge"; Assert.Null(changedPropeyty); Assert.False(filter.IsDirty); }
public void SetProperty_Test() { var filter = new PostFilterRule(); string changedPropeyty = null; filter.PropertyChanged += (_, x) => changedPropeyty = x.PropertyName; filter.FilterName = "hogehoge"; Assert.Equal("FilterName", changedPropeyty); Assert.True(filter.IsDirty); }
public void MatchOnlyTest() { var filter = new PostFilterRule { FilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); }
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)); }
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 = "<a href='http://example.com/123'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/123'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // Text に ExFilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName に対しては完全一致 (ExUseRegex = false の場合) post = new PostClass { ScreenName = "_aaa_", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" }; 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 = "<a href='http://example.com/Bbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
public void OnFilterModified_DetachedTest() { var tab = new FilterTabModel("MyTab"); var filter = new PostFilterRule(); tab.FilterArray = new[] { filter }; tab.RemoveFilter(filter); tab.FilterModified = false; // TabClass から既に削除されたフィルタを変更 filter.FilterSource = "OpenTween"; Assert.False(tab.FilterModified); }
public void AddFilter_Test() { var tab = new FilterTabModel("MyTab"); var filter = new PostFilterRule(); tab.AddFilter(filter); Assert.Equal(new[] { filter }, tab.FilterArray); Assert.True(tab.FilterModified); }
public void FilterAll_MoveFilterTest2() { var homeTab = this.tabinfo.GetTabByType(MyCommon.TabUsageType.Home); var myTab1 = new FilterTabModel("MyTab1"); var myTab2 = new FilterTabModel("MyTab2"); this.tabinfo.AddTab(myTab1); this.tabinfo.AddTab(myTab2); var filter1 = new PostFilterRule { FilterName = "aaa", // マッチしたら移動 MoveMatches = true, }; myTab1.AddFilter(filter1); myTab1.FilterModified = false; var filter2 = new PostFilterRule { FilterName = "bbb", // マッチしたら移動 MoveMatches = true, }; myTab2.AddFilter(filter2); myTab2.FilterModified = false; this.tabinfo.AddPost(new PostClass { StatusId = 100L, ScreenName = "aaa" }); this.tabinfo.AddPost(new PostClass { StatusId = 200L, ScreenName = "bbb" }); this.tabinfo.AddPost(new PostClass { StatusId = 300L, ScreenName = "ccc" }); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // この時点での振り分け状態 Assert.Equal(new[] { 300L }, homeTab.StatusIds); Assert.Equal(new[] { 100L }, myTab1.StatusIds); Assert.Equal(new[] { 200L }, myTab2.StatusIds); // MyTab1 のフィルタを変更する filter1.FilterName = "bbb"; // MyTab2 のフィルタを変更する filter2.FilterName = "ccc"; // フィルタの変更を反映 this.tabinfo.FilterAll(); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // 期待する動作: // [statusId: 100] は MyTab1 から取り除かれて Recent に戻される // [statusId: 200] は MyTab1 に移動される // [statusId: 200] は MyTab2 から取り除かれるが MyTab1 に移動されているので Recent には戻さない // [statusId: 300] は Recent から MyTab2 に移動される // 変更後の振り分け状態 Assert.Equal(new[] { 100L }, homeTab.StatusIds); Assert.Equal(new[] { 200L }, myTab1.StatusIds); Assert.Equal(new[] { 300L }, myTab2.StatusIds); }
public void OnFilterModified_Test() { var tab = new FilterTabModel("MyTab"); var filter = new PostFilterRule(); tab.FilterArray = new[] { filter }; tab.FilterModified = false; // TabClass に紐付いているフィルタを変更 filter.FilterSource = "OpenTween"; Assert.True(tab.FilterModified); }
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 { Source = "****", SourceUri = new Uri("http://example.com/hogehoge") }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { Source = "****", SourceUri = new Uri("http://example.com/foo") }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { Source = "****", SourceUri = new Uri("http://example.com/HogeHoge") }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { Source = "****", SourceUri = new Uri("http://example.com/HogeHoge") }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
public void FilterAll_CopyAndMarkFilterTest() { var homeTab = this.tabinfo.GetTabByType(MyCommon.TabUsageType.Home); var myTab1 = new FilterTabModel("MyTab1"); this.tabinfo.AddTab(myTab1); var filter = new PostFilterRule { FilterName = "aaa", // コピー+マーク MoveMatches = false, MarkMatches = true, }; myTab1.AddFilter(filter); myTab1.FilterModified = false; this.tabinfo.AddPost(new PostClass { StatusId = 100L, ScreenName = "aaa" }); this.tabinfo.AddPost(new PostClass { StatusId = 200L, ScreenName = "bbb" }); this.tabinfo.AddPost(new PostClass { StatusId = 300L, ScreenName = "ccc" }); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // この時点での振り分け状態 Assert.Equal(new[] { 100L, 200L, 300L }, homeTab.StatusIds, AnyOrderComparer<long>.Instance); Assert.Equal(new[] { 100L }, myTab1.StatusIds); // フィルタを変更する filter.FilterName = "bbb"; // フィルタの変更を反映 this.tabinfo.FilterAll(); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // 期待する動作: // [statusId: 100] は MyTab1 から取り除かれる // [statusId: 200] は Recent から MyTab1 にコピーされ、マークが付与される // 変更後の振り分け状態 Assert.Equal(new[] { 100L, 200L, 300L }, homeTab.StatusIds, AnyOrderComparer<long>.Instance); Assert.Equal(new[] { 200L }, myTab1.StatusIds); // [statusId: 200] は IsMark が true の状態になる Assert.True(this.tabinfo[200L].IsMark); }
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)); }
public void FilterAll_ExcludeReplyFilterTest() { var homeTab = this.tabinfo.GetTabByType<HomeTabModel>(); var replyTab = this.tabinfo.GetTabByType<MentionsTabModel>(); var filter = new PostFilterRule { // @aaa からのリプライは Reply タブに振り分けない ExFilterName = "aaa", }; replyTab.AddFilter(filter); replyTab.FilterModified = false; this.tabinfo.AddPost(new PostClass { StatusId = 100L, ScreenName = "aaa", IsReply = true }); this.tabinfo.AddPost(new PostClass { StatusId = 200L, ScreenName = "bbb", IsReply = true }); this.tabinfo.AddPost(new PostClass { StatusId = 300L, ScreenName = "ccc", IsReply = true }); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // この時点での振り分け状態 Assert.Equal(new[] { 100L, 200L, 300L }, homeTab.StatusIds, AnyOrderComparer<long>.Instance); Assert.Equal(new[] { 200L, 300L }, replyTab.StatusIds, AnyOrderComparer<long>.Instance); // [statusId: 100] は IsExcludeReply が true の状態になっている Assert.True(this.tabinfo[100L].IsExcludeReply); // Reply のフィルタを変更する filter.ExFilterName = "bbb"; // フィルタの変更を反映 this.tabinfo.FilterAll(); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // 期待する動作: // [statusId: 100] は Reply にコピーされ、IsExcludeReply が false になる // [statusId: 200] は Reply から取り除かれ、IsExcludeReply が true になる // 変更後の振り分け状態 Assert.Equal(new[] { 100L, 200L, 300L }, homeTab.StatusIds, AnyOrderComparer<long>.Instance); Assert.Equal(new[] { 100L, 300L }, replyTab.StatusIds, AnyOrderComparer<long>.Instance); // [statusId: 100] は IsExcludeReply が false の状態になる Assert.False(this.tabinfo[100L].IsExcludeReply); // [statusId: 200] は IsExcludeReply が true の状態になる Assert.True(this.tabinfo[200L].IsExcludeReply); }
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 = "<a href='http://example.com/123'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の文字列が全て含まれている post = new PostClass { Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName にはマッチしない (ExUseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
public bool AddFilter(PostFilterRule filter) { lock (this.lockObjFilters) { if (_filters.Contains(filter)) return false; filter.PropertyChanged += this.OnFilterModified; _filters.Add(filter); this.FilterModified = true; return true; } }
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)); }