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));
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;
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)]
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));
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;
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)]
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)));
}
}
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
{
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)),