1 // OpenTween - Client of Twitter
2 // Copyright (c) 2013 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
5 // This file is part of OpenTween.
7 // This program is free software; you can redistribute it and/or modify it
8 // under the terms of the GNU General Public License as published by the Free
9 // Software Foundation; either version 3 of the License, or (at your option)
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 // You should have received a copy of the GNU General Public License along
18 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
19 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 // Boston, MA 02110-1301, USA.
23 using System.Collections.Generic;
27 using Xunit.Extensions;
31 public class PostFilterRuleTest
33 public PostFilterRuleTest()
35 PostFilterRule.AutoCompile = true;
39 public void EmptyRuleTest()
41 var filter = new PostFilterRule { };
42 var post = new PostClass { ScreenName = "hogehoge" };
44 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
48 public void NullTest()
50 var filter = new PostFilterRule
55 ExFilterSource = null,
57 var post = new PostClass { ScreenName = "hogehoge" };
59 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
61 Assert.Throws<ArgumentNullException>(() => filter.FilterBody = null);
62 Assert.Throws<ArgumentNullException>(() => filter.ExFilterBody = null);
66 public void MatchOnlyTest()
68 var filter = new PostFilterRule { FilterName = "hogehoge" };
69 var post = new PostClass { ScreenName = "hogehoge" };
71 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
75 public void ExcludeOnlyTest()
77 var filter = new PostFilterRule { ExFilterName = "hogehoge" };
78 var post = new PostClass { ScreenName = "hogehoge" };
80 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
84 public void MatchAndExcludeTest()
86 var filter = new PostFilterRule { FilterName = "hogehoge", ExFilterSource = "tetete" };
87 var post = new PostClass { ScreenName = "hogehoge", Source = "tetete" };
89 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
93 public void PostMatchOptions_CopyTest()
95 var filter = new PostFilterRule { FilterName = "hogehoge" };
96 var post = new PostClass { ScreenName = "hogehoge" };
98 filter.MoveMatches = false;
99 filter.MarkMatches = false;
100 Assert.Equal(MyCommon.HITRESULT.Copy, filter.ExecFilter(post));
104 public void PostMatchOptions_CopyAndMarkTest()
106 var filter = new PostFilterRule { FilterName = "hogehoge" };
107 var post = new PostClass { ScreenName = "hogehoge" };
109 filter.MoveMatches = false;
110 filter.MarkMatches = true;
111 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
115 public void PostMatchOptions_MoveTest()
117 var filter = new PostFilterRule { FilterName = "hogehoge" };
118 var post = new PostClass { ScreenName = "hogehoge" };
120 filter.MoveMatches = true;
121 filter.MarkMatches = false; // 無視される
122 Assert.Equal(MyCommon.HITRESULT.Move, filter.ExecFilter(post));
124 filter.MoveMatches = true;
125 filter.MarkMatches = true; // 無視される
126 Assert.Equal(MyCommon.HITRESULT.Move, filter.ExecFilter(post));
130 public void FilterName_Test()
132 var filter = new PostFilterRule();
135 filter.FilterName = "hogehoge";
137 post = new PostClass { ScreenName = "hogehoge" };
138 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
140 post = new PostClass { ScreenName = "foo" };
141 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
143 // FilterName は RetweetedBy にもマッチする
144 post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" };
145 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
147 post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" };
148 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
150 // FilterName は完全一致 (UseRegex = false の場合)
151 post = new PostClass { ScreenName = "_hogehoge_" };
152 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
155 filter.CaseSensitive = true;
157 post = new PostClass { ScreenName = "HogeHoge" };
158 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
161 filter.CaseSensitive = false;
163 post = new PostClass { ScreenName = "HogeHoge" };
164 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
168 public void ExFilterName_Test()
170 var filter = new PostFilterRule();
173 filter.ExFilterName = "hogehoge";
175 post = new PostClass { ScreenName = "hogehoge" };
176 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
178 post = new PostClass { ScreenName = "foo" };
179 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
181 // ExFilterName は RetweetedBy にもマッチする
182 post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" };
183 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
185 post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" };
186 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
188 // ExFilterName は完全一致 (ExUseRegex = false の場合)
189 post = new PostClass { ScreenName = "_hogehoge_" };
190 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
193 filter.ExCaseSensitive = true;
195 post = new PostClass { ScreenName = "HogeHoge" };
196 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
199 filter.ExCaseSensitive = false;
201 post = new PostClass { ScreenName = "HogeHoge" };
202 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
206 public void FilterName_RegexTest()
208 var filter = new PostFilterRule();
211 filter.UseRegex = true;
212 filter.FilterName = "(hoge){2}";
214 post = new PostClass { ScreenName = "hogehoge" };
215 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
217 post = new PostClass { ScreenName = "foo" };
218 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
220 // FilterName は RetweetedBy にもマッチする
221 post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" };
222 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
224 post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" };
225 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
227 // FilterName は部分一致 (UseRegex = true の場合)
228 post = new PostClass { ScreenName = "_hogehoge_" };
229 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
232 filter.CaseSensitive = true;
234 post = new PostClass { ScreenName = "HogeHoge" };
235 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
238 filter.CaseSensitive = false;
240 post = new PostClass { ScreenName = "HogeHoge" };
241 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
245 public void ExFilterName_RegexTest()
247 var filter = new PostFilterRule();
250 filter.ExUseRegex = true;
251 filter.ExFilterName = "(hoge){2}";
253 post = new PostClass { ScreenName = "hogehoge" };
254 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
256 post = new PostClass { ScreenName = "foo" };
257 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
259 // ExFilterName は RetweetedBy にもマッチする
260 post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" };
261 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
263 post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" };
264 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
266 // ExFilterName は部分一致 (ExUseRegex = true の場合)
267 post = new PostClass { ScreenName = "_hogehoge_" };
268 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
271 filter.ExCaseSensitive = true;
273 post = new PostClass { ScreenName = "HogeHoge" };
274 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
277 filter.ExCaseSensitive = false;
279 post = new PostClass { ScreenName = "HogeHoge" };
280 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
284 public void FilterBody_Test()
286 var filter = new PostFilterRule();
289 filter.FilterBody = new[] { "aaa", "bbb" };
291 post = new PostClass { TextFromApi = "test" };
292 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
295 post = new PostClass { TextFromApi = "aaa" };
296 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
298 // FilterBody の文字列が全て含まれている
299 post = new PostClass { TextFromApi = "123aaa456bbb" };
300 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
302 // ScreenName にはマッチしない (UseNameField = true の場合)
303 post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" };
304 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
307 filter.CaseSensitive = true;
309 post = new PostClass { TextFromApi = "AaaBbb" };
310 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
313 filter.CaseSensitive = false;
315 post = new PostClass { TextFromApi = "AaaBbb" };
316 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
320 public void ExFilterBody_Test()
322 var filter = new PostFilterRule();
325 filter.ExFilterBody = new[] { "aaa", "bbb" };
327 post = new PostClass { TextFromApi = "test" };
328 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
331 post = new PostClass { TextFromApi = "aaa" };
332 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
334 // ExFilterBody の文字列が全て含まれている
335 post = new PostClass { TextFromApi = "123aaa456bbb" };
336 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
338 // ScreenName にはマッチしない (ExUseNameField = true の場合)
339 post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" };
340 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
343 filter.ExCaseSensitive = true;
345 post = new PostClass { TextFromApi = "AaaBbb" };
346 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
349 filter.ExCaseSensitive = false;
351 post = new PostClass { TextFromApi = "AaaBbb" };
352 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
356 public void FilterBody_RegexTest()
358 var filter = new PostFilterRule();
361 filter.UseRegex = true;
362 filter.FilterBody = new[] { "a{3}", "b{3}" };
364 post = new PostClass { TextFromApi = "test" };
365 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
368 post = new PostClass { TextFromApi = "aaa" };
369 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
371 // FilterBody の文字列が全て含まれている
372 post = new PostClass { TextFromApi = "123aaa456bbb" };
373 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
375 // ScreenName にはマッチしない (UseNameField = true の場合)
376 post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" };
377 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
380 filter.CaseSensitive = true;
382 post = new PostClass { TextFromApi = "AaaBbb" };
383 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
386 filter.CaseSensitive = false;
388 post = new PostClass { TextFromApi = "AaaBbb" };
389 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
393 public void ExFilterBody_RegexTest()
395 var filter = new PostFilterRule();
398 filter.ExUseRegex = true;
399 filter.ExFilterBody = new[] { "a{3}", "b{3}" };
401 post = new PostClass { TextFromApi = "test" };
402 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
405 post = new PostClass { TextFromApi = "aaa" };
406 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
408 // ExFilterBody の文字列が全て含まれている
409 post = new PostClass { TextFromApi = "123aaa456bbb" };
410 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
412 // ScreenName にはマッチしない (ExUseNameField = true の場合)
413 post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" };
414 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
417 filter.ExCaseSensitive = true;
419 post = new PostClass { TextFromApi = "AaaBbb" };
420 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
423 filter.ExCaseSensitive = false;
425 post = new PostClass { TextFromApi = "AaaBbb" };
426 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
430 public void FilterBody_ByUrlTest()
432 var filter = new PostFilterRule();
435 // FilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる
436 filter.FilterByUrl = true;
438 filter.FilterBody = new[] { "aaa", "bbb" };
440 post = new PostClass { Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
441 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
444 post = new PostClass { Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" };
445 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
447 // FilterBody の文字列が全て含まれている
448 post = new PostClass { Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" };
449 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
451 // ScreenName にはマッチしない (UseNameField = true の場合)
452 post = new PostClass { ScreenName = "aaabbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
453 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
456 filter.CaseSensitive = true;
458 post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" };
459 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
462 filter.CaseSensitive = false;
464 post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" };
465 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
469 public void ExFilterBody_ByUrlTest()
471 var filter = new PostFilterRule();
474 // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる
475 filter.ExFilterByUrl = true;
477 filter.ExFilterBody = new[] { "aaa", "bbb" };
479 post = new PostClass { Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
480 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
483 post = new PostClass { Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" };
484 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
486 // ExFilterBody の文字列が全て含まれている
487 post = new PostClass { Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" };
488 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
490 // ScreenName にはマッチしない (ExUseNameField = true の場合)
491 post = new PostClass { ScreenName = "aaabbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
492 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
495 filter.ExCaseSensitive = true;
497 post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" };
498 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
501 filter.ExCaseSensitive = false;
503 post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" };
504 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
508 public void FilterBody_ByUrlRegexTest()
510 var filter = new PostFilterRule();
513 // FilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる
514 filter.FilterByUrl = true;
516 filter.UseRegex = true;
517 filter.FilterBody = new[] { "a{3}", "b{3}" };
519 post = new PostClass { Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
520 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
523 post = new PostClass { Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" };
524 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
526 // FilterBody の文字列が全て含まれている
527 post = new PostClass { Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" };
528 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
530 // ScreenName にはマッチしない (UseNameField = true の場合)
531 post = new PostClass { ScreenName = "aaabbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
532 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
535 filter.CaseSensitive = true;
537 post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" };
538 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
541 filter.CaseSensitive = false;
543 post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" };
544 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
548 public void ExFilterBody_ByUrlRegexTest()
550 var filter = new PostFilterRule();
553 // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる
554 filter.ExFilterByUrl = true;
556 filter.ExUseRegex = true;
557 filter.ExFilterBody = new[] { "a{3}", "b{3}" };
559 post = new PostClass { Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
560 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
563 post = new PostClass { Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" };
564 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
566 // ExFilterBody の文字列が全て含まれている
567 post = new PostClass { Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" };
568 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
570 // ScreenName にはマッチしない (ExUseNameField = true の場合)
571 post = new PostClass { ScreenName = "aaabbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
572 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
575 filter.ExCaseSensitive = true;
577 post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" };
578 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
581 filter.ExCaseSensitive = false;
583 post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" };
584 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
588 public void FilterBodyAndName_Test()
590 var filter = new PostFilterRule();
593 // UseNameField = false の場合は FilterBody のマッチ対象が TextFromApi と ScreenName の両方になる
594 filter.UseNameField = false;
596 filter.FilterBody = new[] { "aaa", "bbb" };
598 post = new PostClass { ScreenName = "hoge", TextFromApi = "test" };
599 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
601 // FilterBody の片方だけではマッチしない
602 post = new PostClass { ScreenName = "hoge", TextFromApi = "aaa" };
603 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
605 // FilterBody の片方だけではマッチしない
606 post = new PostClass { ScreenName = "aaa", TextFromApi = "test" };
607 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
609 // TextFromApi に FilterBody の文字列が全て含まれている
610 post = new PostClass { ScreenName = "hoge", TextFromApi = "123aaa456bbb" };
611 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
613 // TextFromApi と ScreenName に FilterBody の文字列がそれぞれ含まれている
614 post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" };
615 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
617 // TextFromApi と RetweetedBy に FilterBody の文字列がそれぞれ含まれている
618 post = new PostClass { ScreenName = "hoge", TextFromApi = "bbb", RetweetedBy = "aaa" };
619 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
621 // RetweetedBy が null でなくても依然として ScreenName にはマッチする
622 post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb", RetweetedBy = "hoge" };
623 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
625 // ScreenName に対しては完全一致 (UseRegex = false の場合)
626 post = new PostClass { ScreenName = "_aaa_", TextFromApi = "bbb" };
627 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
629 // TextFromApi に対しては UseRegex に関わらず常に部分一致
630 post = new PostClass { ScreenName = "aaa", TextFromApi = "_bbb_" };
631 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
634 filter.CaseSensitive = true;
636 post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" };
637 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
639 post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" };
640 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
643 filter.CaseSensitive = false;
645 post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" };
646 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
648 post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" };
649 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
653 public void ExFilterBodyAndName_Test()
655 var filter = new PostFilterRule();
658 // ExUseNameField = false の場合は ExFilterBody のマッチ対象が TextFromApi と ScreenName の両方になる
659 filter.ExUseNameField = false;
661 filter.ExFilterBody = new[] { "aaa", "bbb" };
663 post = new PostClass { ScreenName = "hoge", TextFromApi = "test" };
664 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
666 // ExFilterBody の片方だけではマッチしない
667 post = new PostClass { ScreenName = "hoge", TextFromApi = "aaa" };
668 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
670 // ExFilterBody の片方だけではマッチしない
671 post = new PostClass { ScreenName = "aaa", TextFromApi = "test" };
672 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
674 // TextFromApi に ExFilterBody の文字列が全て含まれている
675 post = new PostClass { ScreenName = "hoge", TextFromApi = "123aaa456bbb" };
676 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
678 // TextFromApi と ScreenName に ExFilterBody の文字列がそれぞれ含まれている
679 post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" };
680 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
682 // TextFromApi と RetweetedBy に ExFilterBody の文字列がそれぞれ含まれている
683 post = new PostClass { ScreenName = "hoge", TextFromApi = "bbb", RetweetedBy = "aaa" };
684 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
686 // RetweetedBy が null でなくても依然として ScreenName にはマッチする
687 post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb", RetweetedBy = "hoge" };
688 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
690 // ScreenName に対しては完全一致 (ExUseRegex = false の場合)
691 post = new PostClass { ScreenName = "_aaa_", TextFromApi = "bbb" };
692 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
694 // TextFromApi に対しては ExUseRegex に関わらず常に部分一致
695 post = new PostClass { ScreenName = "aaa", TextFromApi = "_bbb_" };
696 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
699 filter.ExCaseSensitive = true;
701 post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" };
702 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
704 post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" };
705 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
708 filter.ExCaseSensitive = false;
710 post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" };
711 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
713 post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" };
714 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
718 public void FilterBodyAndName_RegexTest()
720 var filter = new PostFilterRule();
723 // UseNameField = false の場合は FilterBody のマッチ対象が TextFromApi と ScreenName の両方になる
724 filter.UseNameField = false;
726 filter.UseRegex = true;
727 filter.FilterBody = new[] { "a{3}", "b{3}" };
729 post = new PostClass { ScreenName = "hoge", TextFromApi = "test" };
730 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
732 // FilterBody の片方だけではマッチしない
733 post = new PostClass { ScreenName = "hoge", TextFromApi = "aaa" };
734 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
736 // FilterBody の片方だけではマッチしない
737 post = new PostClass { ScreenName = "aaa", TextFromApi = "test" };
738 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
740 // TextFromApi に FilterBody の文字列が全て含まれている
741 post = new PostClass { ScreenName = "hoge", TextFromApi = "123aaa456bbb" };
742 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
744 // TextFromApi と ScreenName に FilterBody の文字列がそれぞれ含まれている
745 post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" };
746 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
748 // TextFromApi と RetweetedBy に FilterBody の文字列がそれぞれ含まれている
749 post = new PostClass { ScreenName = "hoge", TextFromApi = "bbb", RetweetedBy = "aaa" };
750 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
752 // RetweetedBy が null でなくても依然として ScreenName にはマッチする
753 post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb", RetweetedBy = "hoge" };
754 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
756 // ScreenName に対しても部分一致 (UseRegex = true の場合)
757 post = new PostClass { ScreenName = "_aaa_", TextFromApi = "bbb" };
758 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
760 // TextFromApi に対しては UseRegex に関わらず常に部分一致
761 post = new PostClass { ScreenName = "aaa", TextFromApi = "_bbb_" };
762 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
765 filter.CaseSensitive = true;
767 post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" };
768 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
770 post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" };
771 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
774 filter.CaseSensitive = false;
776 post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" };
777 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
779 post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" };
780 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
784 public void ExFilterBodyAndName_RegexTest()
786 var filter = new PostFilterRule();
789 // ExUseNameField = false の場合は ExFilterBody のマッチ対象が TextFromApi と ScreenName の両方になる
790 filter.ExUseNameField = false;
792 filter.ExUseRegex = true;
793 filter.ExFilterBody = new[] { "a{3}", "b{3}" };
795 post = new PostClass { ScreenName = "hoge", TextFromApi = "test" };
796 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
798 // ExFilterBody の片方だけではマッチしない
799 post = new PostClass { ScreenName = "hoge", TextFromApi = "aaa" };
800 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
802 // ExFilterBody の片方だけではマッチしない
803 post = new PostClass { ScreenName = "aaa", TextFromApi = "test" };
804 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
806 // TextFromApi に ExFilterBody の文字列が全て含まれている
807 post = new PostClass { ScreenName = "hoge", TextFromApi = "123aaa456bbb" };
808 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
810 // TextFromApi と ScreenName に ExFilterBody の文字列がそれぞれ含まれている
811 post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" };
812 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
814 // TextFromApi と RetweetedBy に ExFilterBody の文字列がそれぞれ含まれている
815 post = new PostClass { ScreenName = "hoge", TextFromApi = "bbb", RetweetedBy = "aaa" };
816 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
818 // RetweetedBy が null でなくても依然として ScreenName にはマッチする
819 post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb", RetweetedBy = "hoge" };
820 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
822 // ScreenName に対しても部分一致 (ExUseRegex = true の場合)
823 post = new PostClass { ScreenName = "_aaa_", TextFromApi = "bbb" };
824 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
826 // TextFromApi に対しては ExUseRegex に関わらず常に部分一致
827 post = new PostClass { ScreenName = "aaa", TextFromApi = "_bbb_" };
828 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
831 filter.ExCaseSensitive = true;
833 post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" };
834 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
836 post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" };
837 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
840 filter.ExCaseSensitive = false;
842 post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" };
843 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
845 post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" };
846 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
850 public void FilterBodyAndName_ByUrlTest()
852 var filter = new PostFilterRule();
855 // FilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる
856 filter.FilterByUrl = true;
858 // UseNameField = false の場合は FilterBody のマッチ対象が Text と ScreenName の両方になる
859 filter.UseNameField = false;
861 filter.FilterBody = new[] { "aaa", "bbb" };
863 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
864 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
866 // FilterBody の片方だけではマッチしない
867 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" };
868 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
870 // FilterBody の片方だけではマッチしない
871 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
872 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
874 // Text に FilterBody の文字列が全て含まれている
875 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" };
876 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
878 // Text と ScreenName に FilterBody の文字列がそれぞれ含まれている
879 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" };
880 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
882 // Text と ScreenName に FilterBody の文字列がそれぞれ含まれている
883 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "aaa" };
884 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
886 // RetweetedBy が null でなくても依然として ScreenName にはマッチする
887 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "hoge" };
888 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
890 // ScreenName に対しては完全一致 (UseRegex = false の場合)
891 post = new PostClass { ScreenName = "_aaa_", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" };
892 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
894 // Text に対しては UseRegex に関わらず常に部分一致
895 post = new PostClass { ScreenName = "aaa", Text = "_bbb_" };
896 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
899 filter.CaseSensitive = true;
901 post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" };
902 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
904 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" };
905 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
908 filter.CaseSensitive = false;
910 post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" };
911 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
913 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" };
914 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
918 public void ExFilterBodyAndName_ByUrlTest()
920 var filter = new PostFilterRule();
923 // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる
924 filter.ExFilterByUrl = true;
926 // ExUseNameField = false の場合は ExFilterBody のマッチ対象が Text と ScreenName の両方になる
927 filter.ExUseNameField = false;
929 filter.ExFilterBody = new[] { "aaa", "bbb" };
931 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
932 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
934 // ExFilterBody の片方だけではマッチしない
935 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" };
936 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
938 // ExFilterBody の片方だけではマッチしない
939 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
940 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
942 // Text に ExFilterBody の文字列が全て含まれている
943 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" };
944 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
946 // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている
947 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" };
948 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
950 // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている
951 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "aaa" };
952 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
954 // RetweetedBy が null でなくても依然として ScreenName にはマッチする
955 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "hoge" };
956 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
958 // ScreenName に対しては完全一致 (ExUseRegex = false の場合)
959 post = new PostClass { ScreenName = "_aaa_", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" };
960 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
962 // Text に対しては ExUseRegex に関わらず常に部分一致
963 post = new PostClass { ScreenName = "aaa", Text = "_bbb_" };
964 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
967 filter.ExCaseSensitive = true;
969 post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" };
970 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
972 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" };
973 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
976 filter.ExCaseSensitive = false;
978 post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" };
979 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
981 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" };
982 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
986 public void FilterBodyAndName_ByUrlRegexTest()
988 var filter = new PostFilterRule();
991 // FilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる
992 filter.FilterByUrl = true;
994 // UseNameField = false の場合は FilterBody のマッチ対象が Text と ScreenName の両方になる
995 filter.UseNameField = false;
997 filter.UseRegex = true;
998 filter.FilterBody = new[] { "a{3}", "b{3}" };
1000 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
1001 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1003 // FilterBody の片方だけではマッチしない
1004 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" };
1005 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1007 // FilterBody の片方だけではマッチしない
1008 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
1009 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1011 // Text に FilterBody の文字列が全て含まれている
1012 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" };
1013 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1015 // Text と ScreenName に FilterBody の文字列がそれぞれ含まれている
1016 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" };
1017 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1019 // Text と ScreenName に FilterBody の文字列がそれぞれ含まれている
1020 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "aaa" };
1021 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1023 // RetweetedBy が null でなくても依然として ScreenName にはマッチする
1024 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "hoge" };
1025 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1027 // ScreenName に対しても部分一致 (UseRegex = true の場合)
1028 post = new PostClass { ScreenName = "_aaa_", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" };
1029 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1031 // Text に対しては UseRegex に関わらず常に部分一致
1032 post = new PostClass { ScreenName = "aaa", Text = "_bbb_" };
1033 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1036 filter.CaseSensitive = true;
1038 post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" };
1039 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1041 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" };
1042 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1045 filter.CaseSensitive = false;
1047 post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" };
1048 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1050 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" };
1051 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1055 public void ExFilterBodyAndName_ByUrlRegexTest()
1057 var filter = new PostFilterRule();
1060 // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる
1061 filter.ExFilterByUrl = true;
1063 // ExUseNameField = false の場合は ExFilterBody のマッチ対象が Text と ScreenName の両方になる
1064 filter.ExUseNameField = false;
1066 filter.ExUseRegex = true;
1067 filter.ExFilterBody = new[] { "a{3}", "b{3}" };
1069 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
1070 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1072 // ExFilterBody の片方だけではマッチしない
1073 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" };
1074 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1076 // ExFilterBody の片方だけではマッチしない
1077 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
1078 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1080 // Text に ExFilterBody の文字列が全て含まれている
1081 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" };
1082 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1084 // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている
1085 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" };
1086 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1088 // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている
1089 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "aaa" };
1090 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1092 // RetweetedBy が null でなくても依然として ScreenName にはマッチする
1093 post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "hoge" };
1094 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1096 // ScreenName に対しても部分一致 (ExUseRegex = true の場合)
1097 post = new PostClass { ScreenName = "_aaa_", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" };
1098 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1100 // Text に対しては ExUseRegex に関わらず常に部分一致
1101 post = new PostClass { ScreenName = "aaa", Text = "_bbb_" };
1102 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1105 filter.ExCaseSensitive = true;
1107 post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" };
1108 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1110 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" };
1111 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1114 filter.ExCaseSensitive = false;
1116 post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" };
1117 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1119 post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" };
1120 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1124 public void FilterSource_Test()
1126 var filter = new PostFilterRule();
1129 filter.FilterSource = "hogehoge";
1131 post = new PostClass { Source = "hogehoge" };
1132 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1134 post = new PostClass { Source = "foo" };
1135 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1137 // FilterSource は完全一致 (UseRegex = false の場合)
1138 post = new PostClass { Source = "_hogehoge_" };
1139 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1142 filter.CaseSensitive = true;
1144 post = new PostClass { Source = "HogeHoge" };
1145 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1148 filter.CaseSensitive = false;
1150 post = new PostClass { Source = "HogeHoge" };
1151 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1155 public void ExFilterSource_Test()
1157 var filter = new PostFilterRule();
1160 filter.ExFilterSource = "hogehoge";
1162 post = new PostClass { Source = "hogehoge" };
1163 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1165 post = new PostClass { Source = "foo" };
1166 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1168 // ExFilterSource は完全一致 (ExUseRegex = false の場合)
1169 post = new PostClass { Source = "_hogehoge_" };
1170 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1173 filter.ExCaseSensitive = true;
1175 post = new PostClass { Source = "HogeHoge" };
1176 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1179 filter.ExCaseSensitive = false;
1181 post = new PostClass { Source = "HogeHoge" };
1182 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1186 public void FilterSource_RegexTest()
1188 var filter = new PostFilterRule();
1191 filter.UseRegex = true;
1192 filter.FilterSource = "(hoge){2}";
1194 post = new PostClass { Source = "hogehoge" };
1195 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1197 post = new PostClass { Source = "foo" };
1198 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1200 // FilterSource は部分一致 (UseRegex = true の場合)
1201 post = new PostClass { Source = "_hogehoge_" };
1202 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1205 filter.CaseSensitive = true;
1207 post = new PostClass { Source = "HogeHoge" };
1208 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1211 filter.CaseSensitive = false;
1213 post = new PostClass { Source = "HogeHoge" };
1214 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1218 public void ExFilterSource_RegexTest()
1220 var filter = new PostFilterRule();
1223 filter.ExUseRegex = true;
1224 filter.ExFilterSource = "(hoge){2}";
1226 post = new PostClass { Source = "hogehoge" };
1227 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1229 post = new PostClass { Source = "foo" };
1230 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1232 // ExFilterSource は部分一致 (ExUseRegex = true の場合)
1233 post = new PostClass { Source = "_hogehoge_" };
1234 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1237 filter.ExCaseSensitive = true;
1239 post = new PostClass { Source = "HogeHoge" };
1240 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1243 filter.ExCaseSensitive = false;
1245 post = new PostClass { Source = "HogeHoge" };
1246 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1250 public void FilterSource_ByUrlTest()
1252 var filter = new PostFilterRule();
1255 // FilterByUrl = true の場合は Source ではなく SourceHtml がマッチ対象になる
1256 filter.FilterByUrl = true;
1258 filter.FilterSource = "hogehoge";
1260 // FilterSource は UseRegex の値に関わらず部分一致
1261 post = new PostClass { SourceHtml = "<a href='http://example.com/hogehoge'>****</a>" };
1262 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1264 post = new PostClass { SourceHtml = "<a href='http://example.com/foo'>****</a>" };
1265 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1268 filter.CaseSensitive = true;
1270 post = new PostClass { SourceHtml = "<a href='http://example.com/HogeHoge'>****</a>" };
1271 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1274 filter.CaseSensitive = false;
1276 post = new PostClass { SourceHtml = "<a href='http://example.com/HogeHoge'>****</a>" };
1277 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1281 public void ExFilterSource_ByUrlTest()
1283 var filter = new PostFilterRule();
1286 // ExFilterByUrl = true の場合は Source ではなく SourceHtml がマッチ対象になる
1287 filter.ExFilterByUrl = true;
1289 filter.ExFilterSource = "hogehoge";
1291 // ExFilterSource は ExUseRegex の値に関わらず部分一致
1292 post = new PostClass { SourceHtml = "<a href='http://example.com/hogehoge'>****</a>" };
1293 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1295 post = new PostClass { SourceHtml = "<a href='http://example.com/foo'>****</a>" };
1296 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1299 filter.ExCaseSensitive = true;
1301 post = new PostClass { SourceHtml = "<a href='http://example.com/HogeHoge'>****</a>" };
1302 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1305 filter.ExCaseSensitive = false;
1307 post = new PostClass { SourceHtml = "<a href='http://example.com/HogeHoge'>****</a>" };
1308 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1312 public void FilterSource_ByUrlRegexTest()
1314 var filter = new PostFilterRule();
1317 // FilterByUrl = true の場合は Source ではなく SourceHtml がマッチ対象になる
1318 filter.FilterByUrl = true;
1320 filter.UseRegex = true;
1321 filter.FilterSource = "(hoge){2}";
1323 // FilterSource は UseRegex の値に関わらず部分一致
1324 post = new PostClass { SourceHtml = "<a href='http://example.com/hogehoge'>****</a>" };
1325 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1327 post = new PostClass { SourceHtml = "<a href='http://example.com/foo'>****</a>" };
1328 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1331 filter.CaseSensitive = true;
1333 post = new PostClass { SourceHtml = "<a href='http://example.com/HogeHoge'>****</a>" };
1334 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1337 filter.CaseSensitive = false;
1339 post = new PostClass { SourceHtml = "<a href='http://example.com/HogeHoge'>****</a>" };
1340 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1344 public void ExFilterSource_ByUrlRegexTest()
1346 var filter = new PostFilterRule();
1349 // ExFilterByUrl = true の場合は Source ではなく SourceHtml がマッチ対象になる
1350 filter.ExFilterByUrl = true;
1352 filter.ExUseRegex = true;
1353 filter.ExFilterSource = "(hoge){2}";
1355 // ExFilterSource は ExUseRegex の値に関わらず部分一致
1356 post = new PostClass { SourceHtml = "<a href='http://example.com/hogehoge'>****</a>" };
1357 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1359 post = new PostClass { SourceHtml = "<a href='http://example.com/foo'>****</a>" };
1360 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1363 filter.ExCaseSensitive = true;
1365 post = new PostClass { SourceHtml = "<a href='http://example.com/HogeHoge'>****</a>" };
1366 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1369 filter.ExCaseSensitive = false;
1371 post = new PostClass { SourceHtml = "<a href='http://example.com/HogeHoge'>****</a>" };
1372 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1376 public void FilterRt_Test()
1378 var filter = new PostFilterRule();
1381 filter.FilterRt = true;
1383 post = new PostClass { RetweetedBy = "hogehoge", RetweetedId = 123L };
1384 Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post));
1386 post = new PostClass { };
1387 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));
1391 public void ExFilterRt_Test()
1393 var filter = new PostFilterRule();
1396 filter.ExFilterRt = true;
1398 post = new PostClass { RetweetedBy = "hogehoge", RetweetedId = 123L };
1399 Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post));
1401 post = new PostClass { };
1402 Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post));