/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /** * Tests for for nsAbAutoCompleteSearch scoring. */ var ACR = Ci.nsIAutoCompleteResult; var cards = [ { // 0 email: "jd.who@example.com", displayName: "John Doe (:xx)", popularityIndex: 0, firstName: "John", value: "John Doe (:xx) ", }, { // 1 email: "janey_who@example.com", displayName: "Jane Doe", popularityIndex: 0, value: "Jane Doe ", }, { // 2 email: "pf@example.com", displayName: 'Paul "Shitbreak" Finch', popularityIndex: 0, value: 'Paul "Shitbreak" Finch ', }, { // 3 email: "js@example.com", displayName: "Janine (Stifflers Mom)", popularityIndex: 0, value: "Janine (Stifflers Mom) ", }, { // 4 email: "ex0@example.com", displayName: "Ajden", popularityIndex: 0, value: "Ajden ", }, { // 5 email: "5@example.com", displayName: "Foxx", popularityIndex: 0, value: "Foxx <5@example.com>", }, { // 6 email: "6@example.com", displayName: "thewho", popularityIndex: 0, value: "thewho <6@example.com>", }, { // 7 email: "7@example.com", displayName: "fakeshit", popularityIndex: 0, value: "fakeshit <7@example.com>", }, { // 8 email: "8@example.com", displayName: "mastiff", popularityIndex: 0, value: "mastiff <8@example.com>", }, { // 9 email: "9@example.com", displayName: "anyjohn", popularityIndex: 0, value: "anyjohn <9@example.com>", }, { // 10 email: "10@example.com", displayName: "däsh l18n", popularityIndex: 0, value: "däsh l18n <10@example.com>", }, { // 11 email: "11@example.com", displayName: "paul mary", popularityIndex: 0, firstName: "paul", lastName: "mary meyer", value: "paul mary <11@example.com>", }, { // 12 email: "12@example.com", displayName: "paul meyer", popularityIndex: 0, firstName: "paul", lastName: "mary meyer", value: "paul meyer <12@example.com>", }, { // 13 email: "13@example.com", displayName: "mr iron man (exp dev)", popularityIndex: 0, firstName: "iron", lastName: "man", value: "mr iron man (exp dev) <13@example.com>", }, { // 14 email: "14@example.com", displayName: "michael", popularityIndex: 0, nickName: "short", value: "michael <14@example.com>", }, { // 15 email: "15@example.com", displayName: "good boy", popularityIndex: 0, nickName: "sh", value: "good boy <15@example.com>", }, { // 16 email: "16@example.com", displayName: "sherlock holmes", popularityIndex: 0, value: "sherlock holmes <16@example.com>", }, ]; var inputs = [ { search: "john", expected: [0, 9] }, { search: "doe", expected: [1, 0] }, { search: "jd", expected: [0, 4] }, { search: "who", expected: [1, 0, 6] }, { search: "xx", expected: [0, 5] }, { search: "jan", expected: [1, 3] }, // expecting nickname to score highest. { search: "sh", expected: [15, 14, 2, 16, 10, 7] }, { search: "st", expected: [3, 8] }, { search: "paul mary", expected: [11, 12] }, { search: '"paul mary"', expected: [11] }, { search: '"iron man" mr "exp dev"', expected: [13] }, { search: "short", expected: [14] }, ]; add_task(async () => { // We set up the cards for this test manually as it is easier to set the // popularity index and we don't need many. // Ensure all the directories are initialised. MailServices.ab.directories; let ab = MailServices.ab.getDirectory(kPABData.URI); function createAndAddCard(element) { var card = Cc["@mozilla.org/addressbook/cardproperty;1"].createInstance( Ci.nsIAbCard ); card.primaryEmail = element.email; card.displayName = element.displayName; card.setProperty("PopularityIndex", element.popularityIndex); card.firstName = element.firstName; card.lastName = element.lastName; if ("nickName" in element) { card.setProperty("NickName", element.nickName); } ab.addCard(card); } cards.forEach(createAndAddCard); // Test - duplicate elements var acs = Cc["@mozilla.org/autocomplete/search;1?name=addrbook"].getService( Ci.nsIAutoCompleteSearch ); var obs = new acObserver(); async function checkInputItem(element, index) { print("Search #" + index + ": search=" + element.search); let resultPromise = obs.waitForResult(); acs.startSearch( element.search, JSON.stringify({ type: "addr_to" }), null, obs ); await resultPromise; for (let i = 0; i < obs._result.matchCount; i++) { print("... got " + i + ": " + obs._result.getValueAt(i)); } for (let i = 0; i < element.expected.length; i++) { print( "... expected " + i + " (card " + element.expected[i] + "): " + cards[element.expected[i]].value ); } Assert.equal(obs._search, acs); Assert.equal(obs._result.searchString, element.search); Assert.equal(obs._result.searchResult, ACR.RESULT_SUCCESS); Assert.equal(obs._result.errorDescription, null); Assert.equal(obs._result.matchCount, element.expected.length); for (let i = 0; i < element.expected.length; ++i) { Assert.equal(obs._result.getValueAt(i), cards[element.expected[i]].value); Assert.equal(obs._result.getLabelAt(i), cards[element.expected[i]].value); } } for (let i = 0; i < inputs.length; i++) { await checkInputItem(inputs[i], i); } });