geary/test/client/util/util-email-test.vala
Michael Gratton 642bf00e88 Util.Email.SearchExpressionFactory: Use ICU for work breaking
Implement search query text word segmentaion using ICU, so that
languages that don't use spaces for word delimiters are correctly
tokenised.
2021-01-19 20:49:01 +11:00

477 lines
20 KiB
Vala

/*
* Copyright 2019 Michael Gratton <mike@vee.net>
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
*/
public class Util.Email.Test : TestCase {
private Application.Configuration? config = null;
private Geary.AccountInformation? account = null;
public Test() {
base("Util.Email.Test");
add_test("null_originator", null_originator);
add_test("from_originator", from_originator);
add_test("sender_originator", sender_originator);
add_test("reply_to_originator", reply_to_originator);
add_test("reply_to_via_originator", reply_to_via_originator);
add_test("plain_via_originator", plain_via_originator);
add_test("empty_search_query", empty_search_query);
add_test("plain_search_terms", plain_search_terms);
add_test("continuation_search_terms", continuation_search_terms);
add_test("i18n_search_terms", i18n_search_terms);
add_test("multiple_search_terms", multiple_search_terms);
add_test("quoted_search_terms", quoted_search_terms);
add_test("text_op_terms", text_op_terms);
add_test("text_op_single_me_terms", text_op_single_me_terms);
add_test("text_op_multiple_me_terms", text_op_multiple_me_terms);
add_test("boolean_op_terms", boolean_op_terms);
add_test("invalid_op_terms", invalid_op_terms);
}
public override void set_up() {
this.config = new Application.Configuration(Application.Client.SCHEMA_ID);
this.account = new Geary.AccountInformation(
"test",
OTHER,
new Mock.CredentialsMediator(),
new Geary.RFC822.MailboxAddress("test", "test@example.com")
);
}
public override void tear_down() {
this.config = null;
this.account = null;
}
public void null_originator() throws GLib.Error {
Geary.RFC822.MailboxAddress? originator = get_primary_originator(
new_email(null, null, null)
);
assert_null(originator);
}
public void from_originator() throws GLib.Error {
Geary.RFC822.MailboxAddress? originator = get_primary_originator(
new_email(
new Geary.RFC822.MailboxAddress("from", "from@example.com"),
new Geary.RFC822.MailboxAddress("sender", "sender@example.com"),
new Geary.RFC822.MailboxAddress("reply-to", "reply-to@example.com")
)
);
assert_non_null(originator);
assert_equal(originator.name, "from");
assert_equal(originator.address, "from@example.com");
}
public void sender_originator() throws GLib.Error {
Geary.RFC822.MailboxAddress? originator = get_primary_originator(
new_email(
null,
new Geary.RFC822.MailboxAddress("sender", "sender@example.com"),
new Geary.RFC822.MailboxAddress("reply-to", "reply-to@example.com")
)
);
assert_non_null(originator);
assert_equal(originator.name, "sender");
assert_equal(originator.address, "sender@example.com");
}
public void reply_to_originator() throws GLib.Error {
Geary.RFC822.MailboxAddress? originator = get_primary_originator(
new_email(
null,
null,
new Geary.RFC822.MailboxAddress("reply-to", "reply-to@example.com")
)
);
assert_non_null(originator);
assert_equal(originator.name, "reply-to");
assert_equal(originator.address, "reply-to@example.com");
}
public void reply_to_via_originator() throws GLib.Error {
Geary.RFC822.MailboxAddress? originator = get_primary_originator(
new_email(
new Geary.RFC822.MailboxAddress("test via bot", "bot@example.com"),
null,
new Geary.RFC822.MailboxAddress("test", "test@example.com")
)
);
assert_non_null(originator);
assert_equal(originator.name, "test");
assert_equal(originator.address, "test@example.com");
}
public void plain_via_originator() throws GLib.Error {
Geary.RFC822.MailboxAddress? originator = get_primary_originator(
new_email(
new Geary.RFC822.MailboxAddress("test via bot", "bot@example.com"),
null,
null
)
);
assert_non_null(originator);
assert_equal(originator.name, "test");
assert_equal(originator.address, "bot@example.com");
}
public void empty_search_query() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(), this.account
);
assert_collection(test_article.parse_query("")).is_empty();
}
public void plain_search_terms() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(), this.account
);
var simple1 = test_article.parse_query("hello");
assert_collection(simple1).size(1);
assert_true(simple1[0] is Geary.SearchQuery.EmailTextTerm);
var text1 = simple1[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text1.target == ALL);
assert_true(text1.matching_strategy == CONSERVATIVE);
assert_collection(text1.terms).size(1).contains("hello");
var simple2 = test_article.parse_query("h");
assert_collection(simple2).size(1);
assert_true(simple2[0] is Geary.SearchQuery.EmailTextTerm);
var text2 = simple2[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text2.terms).size(1).contains("h");
var simple3 = test_article.parse_query(" h");
assert_collection(simple3).size(1);
assert_true(simple3[0] is Geary.SearchQuery.EmailTextTerm);
var text3 = simple3[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text3.terms).size(1).contains("h");
var simple4 = test_article.parse_query("h ");
assert_collection(simple4).size(1);
assert_true(simple4[0] is Geary.SearchQuery.EmailTextTerm);
var text4 = simple4[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text4.terms).size(1).contains("h");
}
public void continuation_search_terms() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(),
this.account
);
var simple1 = test_article.parse_query("hello-there");
assert_collection(simple1).size(1);
assert_true(simple1[0] is Geary.SearchQuery.EmailTextTerm);
var text1 = simple1[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text1.terms).size(1).contains("hello-there");
var simple2 = test_article.parse_query("hello-");
assert_collection(simple2).size(1);
assert_true(simple2[0] is Geary.SearchQuery.EmailTextTerm);
var text2 = simple2[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text2.terms).size(1).contains("hello-");
var simple3 = test_article.parse_query("test@example.com");
assert_collection(simple2).size(1);
assert_true(simple3[0] is Geary.SearchQuery.EmailTextTerm);
var text3 = simple3[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text3.terms).size(1).contains("test@example.com");
}
public void i18n_search_terms() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(),
this.account
);
var thai = test_article.parse_query("ภาษาไทย");
assert_collection(thai).size(2);
assert_true(thai[0] is Geary.SearchQuery.EmailTextTerm);
assert_true(thai[1] is Geary.SearchQuery.EmailTextTerm);
assert_collection(
((Geary.SearchQuery.EmailTextTerm) thai[0]).terms
).size(1).contains("ภาษา");
assert_collection(
((Geary.SearchQuery.EmailTextTerm) thai[1]).terms
).size(1).contains("ไทย");
var chinese = test_article.parse_query("男子去");
assert_collection(chinese).size(2);
assert_true(chinese[0] is Geary.SearchQuery.EmailTextTerm);
assert_true(chinese[1] is Geary.SearchQuery.EmailTextTerm);
assert_collection(
((Geary.SearchQuery.EmailTextTerm) chinese[0]).terms
).size(1).contains("男子");
assert_collection(
((Geary.SearchQuery.EmailTextTerm) chinese[1]).terms
).size(1).contains("");
}
public void multiple_search_terms() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(), this.account
);
var multiple = test_article.parse_query("hello there");
assert_collection(multiple).size(2);
assert_true(multiple[0] is Geary.SearchQuery.EmailTextTerm);
assert_true(multiple[1] is Geary.SearchQuery.EmailTextTerm);
assert_collection(
((Geary.SearchQuery.EmailTextTerm) multiple[0]).terms
).size(1).contains("hello");
assert_collection(
((Geary.SearchQuery.EmailTextTerm) multiple[1]).terms
).size(1).contains("there");
}
public void quoted_search_terms() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(), this.account
);
var simple1 = test_article.parse_query("\"hello\"");
assert_collection(simple1).size(1);
assert_true(simple1[0] is Geary.SearchQuery.EmailTextTerm);
var text1 = simple1[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text1.target == ALL);
assert_true(text1.matching_strategy == EXACT);
assert_collection(text1.terms).size(1).contains("hello");
var simple2 = test_article.parse_query("\"h\"");
assert_collection(simple2).size(1);
assert_true(simple2[0] is Geary.SearchQuery.EmailTextTerm);
var text2 = simple2[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text2.terms).size(1).contains("h");
var simple3 = test_article.parse_query(" \"h\"");
assert_collection(simple3).size(1);
assert_true(simple3[0] is Geary.SearchQuery.EmailTextTerm);
var text3 = simple3[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text3.terms).size(1).contains("h");
var simple4 = test_article.parse_query("\"h");
assert_collection(simple4).size(1);
assert_true(simple4[0] is Geary.SearchQuery.EmailTextTerm);
var text4 = simple4[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text4.terms).size(1).contains("h");
var simple5 = test_article.parse_query("\"h\" ");
assert_collection(simple5).size(1);
assert_true(simple5[0] is Geary.SearchQuery.EmailTextTerm);
var text5 = simple5[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text5.terms).size(1).contains("h");
var simple6 = test_article.parse_query("\"hello there\"");
assert_collection(simple6).size(1);
assert_true(simple6[0] is Geary.SearchQuery.EmailTextTerm);
var text6 = simple6[0] as Geary.SearchQuery.EmailTextTerm;
assert_collection(text6.terms).size(1).contains("hello there");
}
public void text_op_terms() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(), this.account
);
var simple_body = test_article.parse_query("body:hello");
assert_collection(simple_body).size(1);
assert_true(simple_body[0] is Geary.SearchQuery.EmailTextTerm, "type");
var text_body = simple_body[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_body.target == BODY, "target");
assert_true(text_body.matching_strategy == CONSERVATIVE, "strategy");
assert_collection(text_body.terms).size(1).contains("hello");
var simple_body_quoted = test_article.parse_query("body:\"hello\"");
assert_collection(simple_body_quoted).size(1);
assert_true(simple_body_quoted[0] is Geary.SearchQuery.EmailTextTerm);
var text_body_quoted = simple_body_quoted[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_body_quoted.target == BODY);
assert_true(text_body_quoted.matching_strategy == EXACT);
assert_collection(text_body_quoted.terms).size(1).contains("hello");
var simple_attach_name = test_article.parse_query("attachment:hello");
assert_collection(simple_attach_name).size(1);
assert_true(simple_attach_name[0] is Geary.SearchQuery.EmailTextTerm);
var text_attch_name = simple_attach_name[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_attch_name.target == ATTACHMENT_NAME);
var simple_bcc = test_article.parse_query("bcc:hello");
assert_collection(simple_bcc).size(1);
assert_true(simple_bcc[0] is Geary.SearchQuery.EmailTextTerm);
var text_bcc = simple_bcc[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_bcc.target == BCC);
var simple_cc = test_article.parse_query("cc:hello");
assert_collection(simple_cc).size(1);
assert_true(simple_cc[0] is Geary.SearchQuery.EmailTextTerm);
var text_cc = simple_cc[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_cc.target == CC);
var simple_from = test_article.parse_query("from:hello");
assert_collection(simple_from).size(1);
assert_true(simple_from[0] is Geary.SearchQuery.EmailTextTerm);
var text_from = simple_from[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_from.target == FROM);
var simple_subject = test_article.parse_query("subject:hello");
assert_collection(simple_subject).size(1);
assert_true(simple_subject[0] is Geary.SearchQuery.EmailTextTerm);
var text_subject = simple_subject[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_subject.target == SUBJECT);
var simple_to = test_article.parse_query("to:hello");
assert_collection(simple_to).size(1);
assert_true(simple_to[0] is Geary.SearchQuery.EmailTextTerm);
var text_to = simple_to[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_to.target == TO);
}
public void text_op_single_me_terms() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(), this.account
);
var simple_to = test_article.parse_query("to:me");
assert_collection(simple_to).size(1);
assert_true(simple_to[0] is Geary.SearchQuery.EmailTextTerm);
var text_to = simple_to[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_to.target == TO);
assert_true(text_to.matching_strategy == EXACT);
assert_collection(text_to.terms).size(1).contains("test@example.com");
var simple_cc = test_article.parse_query("cc:me");
assert_collection(simple_cc).size(1);
assert_true(simple_cc[0] is Geary.SearchQuery.EmailTextTerm);
var text_cc = simple_cc[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_cc.target == CC);
assert_true(text_cc.matching_strategy == EXACT);
assert_collection(text_cc.terms).size(1).contains("test@example.com");
var simple_bcc = test_article.parse_query("bcc:me");
assert_collection(simple_bcc).size(1);
assert_true(simple_bcc[0] is Geary.SearchQuery.EmailTextTerm);
var text_bcc = simple_bcc[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_bcc.target == BCC);
assert_true(text_bcc.matching_strategy == EXACT);
assert_collection(text_bcc.terms).size(1).contains("test@example.com");
var simple_from = test_article.parse_query("from:me");
assert_collection(simple_from).size(1);
assert_true(simple_from[0] is Geary.SearchQuery.EmailTextTerm);
var text_from = simple_from[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_from.target == FROM);
assert_true(text_from.matching_strategy == EXACT);
assert_collection(text_from.terms).size(1).contains("test@example.com");
}
public void text_op_multiple_me_terms() throws GLib.Error {
this.account.append_sender(
new Geary.RFC822.MailboxAddress("test2", "test2@example.com")
);
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(), this.account
);
var to = test_article.parse_query("to:me");
assert_collection(to).size(1);
assert_true(to[0] is Geary.SearchQuery.EmailTextTerm);
var text_to = to[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text_to.target == TO);
assert_true(text_to.matching_strategy == EXACT);
assert_collection(text_to.terms).size(2).contains(
"test@example.com"
).contains(
"test@example.com"
);
}
public void boolean_op_terms() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(), this.account
);
var simple_unread = test_article.parse_query("is:unread");
assert_true(simple_unread[0] is Geary.SearchQuery.EmailFlagTerm);
var bool_unread = simple_unread[0] as Geary.SearchQuery.EmailFlagTerm;
assert_true(
bool_unread.value.equal_to(Geary.EmailFlags.UNREAD), "unread flag"
);
assert_false(bool_unread.is_negated, "unread negated");
var simple_read = test_article.parse_query("is:read");
assert_true(simple_read[0] is Geary.SearchQuery.EmailFlagTerm);
var bool_read = simple_read[0] as Geary.SearchQuery.EmailFlagTerm;
assert_true(
bool_read.value.equal_to(Geary.EmailFlags.UNREAD), "read flag"
);
assert_true(bool_read.is_negated, "read negated");
var simple_starred = test_article.parse_query("is:starred");
assert_true(simple_starred[0] is Geary.SearchQuery.EmailFlagTerm);
var bool_starred = simple_starred[0] as Geary.SearchQuery.EmailFlagTerm;
assert_true(
bool_starred.value.equal_to(Geary.EmailFlags.FLAGGED), "starred flag"
);
assert_false(bool_starred.is_negated, "starred negated");
}
public void invalid_op_terms() throws GLib.Error {
var test_article = new SearchExpressionFactory(
this.config.get_search_strategy(), this.account
);
var simple1 = test_article.parse_query("body:");
assert_collection(simple1).size(1);
assert_true(simple1[0] is Geary.SearchQuery.EmailTextTerm);
var text1 = simple1[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text1.target == ALL);
assert_true(text1.matching_strategy == CONSERVATIVE);
assert_collection(text1.terms).size(1).contains("body:");
var simple2 = test_article.parse_query("blarg:");
assert_collection(simple2).size(1);
assert_true(simple2[0] is Geary.SearchQuery.EmailTextTerm);
var text2 = simple2[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text2.target == ALL);
assert_true(text2.matching_strategy == CONSERVATIVE);
assert_collection(text2.terms).size(1).contains("blarg:");
var simple3 = test_article.parse_query("blarg:hello");
assert_collection(simple3).size(1);
assert_true(simple3[0] is Geary.SearchQuery.EmailTextTerm);
var text3 = simple3[0] as Geary.SearchQuery.EmailTextTerm;
assert_true(text3.target == ALL);
assert_true(text3.matching_strategy == CONSERVATIVE);
assert_collection(text3.terms).size(1).contains("blarg:hello");
}
private Geary.Email new_email(Geary.RFC822.MailboxAddress? from,
Geary.RFC822.MailboxAddress? sender,
Geary.RFC822.MailboxAddress? reply_to)
throws GLib.Error {
Geary.Email email = new Geary.Email(new Mock.EmailIdentifer(1));
email.set_originators(
from != null
? new Geary.RFC822.MailboxAddresses(Geary.Collection.single(from))
: null,
sender,
reply_to != null
? new Geary.RFC822.MailboxAddresses(Geary.Collection.single(reply_to))
: null
);
return email;
}
}