OSDN Git Service

振り分け条件のFilterBody (UseNameField=false)がRetweetedByに含まれるスクリーン名にマッチしないバグを修正 (thx @Shoic...
authorKimura Youichi <kim.upsilon@bucyou.net>
Sat, 19 Oct 2013 12:33:17 +0000 (21:33 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 19 Oct 2013 13:05:45 +0000 (22:05 +0900)
OpenTween.Tests/PostFilterRuleTest.cs
OpenTween/PostFilterRule.cs
OpenTween/Resources/ChangeLog.txt

index ea211d4..62d41a9 100644 (file)
@@ -337,6 +337,14 @@ namespace OpenTween
             post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" };
             Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
 
+            // RetweetedBy に FilterBody の文字列が全て含まれている
+            post = new PostClass { ScreenName = "hoge", TextFromApi = "test", RetweetedBy = "aaabbb" };
+            Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
+
+            // RetweetedBy が null でなくても依然として ScreenName にはマッチする
+            post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test", RetweetedBy = "hoge" };
+            Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
+
             // FilterBody と ScreenName に FilterBody の文字列がそれぞれ含まれている
             post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" };
             Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
@@ -353,6 +361,9 @@ namespace OpenTween
             post = new PostClass { ScreenName = "AaaBbb", TextFromApi = "test" };
             Assert.That(filter.ExecFilter(post), Is.EqualTo(MyCommon.HITRESULT.None));
 
+            post = new PostClass { ScreenName = "hoge", TextFromApi = "test", RetweetedBy = "AaaBbb" };
+            Assert.That(filter.ExecFilter(post), Is.EqualTo(MyCommon.HITRESULT.None));
+
             // 大小文字を区別しない
             if (!exclude)
                 filter.CaseSensitive = false;
@@ -364,6 +375,9 @@ namespace OpenTween
 
             post = new PostClass { ScreenName = "AaaBbb", TextFromApi = "test" };
             Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
+
+            post = new PostClass { ScreenName = "hoge", TextFromApi = "test", RetweetedBy = "AaaBbb" };
+            Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
         }
 
         [TestCase(false, new[] { "aaa", "bbb" }, false)]
@@ -417,6 +431,14 @@ namespace OpenTween
             post = new PostClass { ScreenName = "aaabbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
             Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
 
+            // RetweetedBy に FilterBody の文字列が全て含まれている
+            post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/123'>t.co/hoge</a>", RetweetedBy = "aaabbb" };
+            Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
+
+            // RetweetedBy が null でなくても依然として ScreenName にはマッチする
+            post = new PostClass { ScreenName = "aaabbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>", RetweetedBy = "hoge" };
+            Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
+
             // FilterBody と ScreenName に FilterBody の文字列がそれぞれ含まれている
             post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" };
             Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
@@ -433,6 +455,9 @@ namespace OpenTween
             post = new PostClass { ScreenName = "AaaBbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
             Assert.That(filter.ExecFilter(post), Is.EqualTo(MyCommon.HITRESULT.None));
 
+            post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/123'>t.co/hoge</a>", RetweetedBy = "AaaBbb" };
+            Assert.That(filter.ExecFilter(post), Is.EqualTo(MyCommon.HITRESULT.None));
+
             // 大小文字を区別しない
             if (!exclude)
                 filter.CaseSensitive = false;
@@ -444,6 +469,9 @@ namespace OpenTween
 
             post = new PostClass { ScreenName = "AaaBbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>" };
             Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
+
+            post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/123'>t.co/hoge</a>", RetweetedBy = "AaaBbb" };
+            Assert.That(filter.ExecFilter(post), Is.EqualTo(exclude ? MyCommon.HITRESULT.Exclude : MyCommon.HITRESULT.CopyAndMark));
         }
 
         [TestCase(false, "hogehoge", false)]
index a5bc691..ce11538 100644 (file)
@@ -427,12 +427,23 @@ namespace OpenTween
                     else
                         bodyExpr = this.MakeGenericFilter(postParam, "TextFromApi", body, useRegex, caseSensitive);
 
+                    // useNameField = false の場合は ScreenName と RetweetedBy も filterBody のマッチ対象となる
                     if (!useNameField)
                     {
-                        // useNameField = false の場合は ScreenName も filterBody のマッチ対象となる
                         bodyExpr = Expression.OrElse(
                             bodyExpr,
                             this.MakeGenericFilter(postParam, "ScreenName", body, useRegex, caseSensitive));
+
+                        // bodyExpr || x.RetweetedBy != null && <MakeGenericFilter()>
+                        bodyExpr = Expression.OrElse(
+                            bodyExpr,
+                            Expression.AndAlso(
+                                Expression.NotEqual(
+                                    Expression.Property(
+                                        postParam,
+                                        typeof(PostClass).GetProperty("RetweetedBy")),
+                                    Expression.Constant(null)),
+                                this.MakeGenericFilter(postParam, "RetweetedBy", body, useRegex, caseSensitive)));
                     }
                 }
 
@@ -476,17 +487,20 @@ namespace OpenTween
             ParameterExpression postParam, string targetFieldName, string pattern,
             bool useRegex, bool caseSensitive, bool exactMatch = false)
         {
+            // x.<targetFieldName>
+            var targetField = Expression.Property(
+                postParam,
+                typeof(PostClass).GetProperty(targetFieldName));
+
             if (useRegex)
             {
                 var regex = new Regex(pattern, caseSensitive ? RegexOptions.None : RegexOptions.IgnoreCase);
 
-                // regex.IsMatch(x.<targetFieldName>)
+                // regex.IsMatch(targetField)
                 return Expression.Call(
                     Expression.Constant(regex),
                     typeof(Regex).GetMethod("IsMatch", new[] { typeof(string) }),
-                    Expression.Property(
-                        postParam,
-                        typeof(PostClass).GetProperty(targetFieldName)));
+                    targetField);
             }
             else
             {
@@ -495,25 +509,21 @@ namespace OpenTween
                 if (exactMatch)
                 {
                     // 完全一致
-                    // pattern.Equals(x.<targetFieldName>, compOpt)
+                    // pattern.Equals(targetField, compOpt)
                     return Expression.Call(
                         Expression.Constant(pattern),
                         typeof(string).GetMethod("Equals", new[] { typeof(string), typeof(StringComparison) }),
-                        Expression.Property(
-                            postParam,
-                            typeof(PostClass).GetProperty(targetFieldName)),
+                        targetField,
                         Expression.Constant(compOpt));
 
                 }
                 else
                 {
                     // 部分一致
-                    // x.<targetFieldName>.IndexOf(pattern, compOpt) != -1
+                    // targetField.IndexOf(pattern, compOpt) != -1
                     return Expression.NotEqual(
                         Expression.Call(
-                            Expression.Property(
-                                postParam,
-                                typeof(PostClass).GetProperty(targetFieldName)),
+                            targetField,
                             typeof(string).GetMethod("IndexOf", new[] { typeof(string), typeof(StringComparison) }),
                             Expression.Constant(pattern),
                             Expression.Constant(compOpt)),
index f515883..8b5e6ee 100644 (file)
@@ -3,6 +3,7 @@
 ==== Ver 1.1.4-beta1(2013/xx/xx)
  * FIX: 取得したプロフィール画像が壊れていた場合にOpenTweenが異常終了してしまう問題の修正 (thx @5px, @selvaggio!)
  * FIX: 取得した画像が壊れていた場合にメモリリークを起こす可能性のある箇所の修正 (thx @5px!)
+ * FIX: タブ振り分けルールの「単一条件」が公式RTした人のスクリーン名に対してヒットしない問題の修正 (thx @Shoichi_Kublai!)
 
 ==== Ver 1.1.3(2013/10/11)
  * タブ振り分けルールの挙動が若干変わりました