ContactCompareToTest.java

 1package eu.siacs.conversations.entities;
 2
 3import static org.mockito.Mockito.mock;
 4import static org.mockito.Mockito.when;
 5
 6import java.util.ArrayList;
 7import java.util.Collections;
 8import java.util.Random;
 9
10import org.junit.Test;
11import org.junit.runner.RunWith;
12import org.robolectric.RobolectricTestRunner;
13import org.robolectric.annotation.Config;
14import org.robolectric.annotation.ConscryptMode;
15
16import android.os.Build;
17import eu.siacs.conversations.Conversations;
18import eu.siacs.conversations.xmpp.Jid;
19import junit.framework.Assert;
20
21@RunWith(RobolectricTestRunner.class)
22@Config(sdk = Build.VERSION_CODES.TIRAMISU, application = Conversations.class)
23@ConscryptMode(ConscryptMode.Mode.OFF)
24public class ContactCompareToTest {
25
26    private static final Jid ACCOUNT_JID = Jid.of("test@example.org");
27
28    private Contact contact(String systemName, String jid) {
29        final var account = mock(Account.class);
30        when(account.getJid()).thenReturn(ACCOUNT_JID);
31        final var contact = new Contact(
32            null, systemName, null, null,
33            Jid.of(jid), 0, null, null,
34            null, null, 0, null, null, null
35        );
36        contact.setAccount(account);
37        return contact;
38    }
39
40    private Bookmark bookmark(String name, String jid) {
41        final var account = mock(Account.class);
42        when(account.getJid()).thenReturn(Jid.of("test@example.org"));
43        final var bookmark = new Bookmark(account, Jid.of(jid));
44        bookmark.setBookmarkName(name);
45        return bookmark;
46    }
47
48    @Test
49    public void testSortContactsWithCaseVariantNames() {
50        final var items = new ArrayList<ListItem>();
51        for (int i = 0; i < 32; i++) {
52            items.add(contact("alice", String.format("a%02d@example.com", i)));
53            items.add(contact("Alice", String.format("b%02d@example.com", i)));
54        }
55
56        for (int seed = 0; seed < 100; seed++) {
57            Collections.shuffle(items, new Random(seed));
58            Collections.sort(items);
59        }
60    }
61
62    @Test
63    public void testSortMixedContactsAndBookmarksWithCaseVariantNames() {
64        final var items = new ArrayList<ListItem>();
65        for (int i = 0; i < 32; i++) {
66            items.add(contact("alice", String.format("a%02d@example.com", i)));
67            items.add(bookmark("Alice", String.format("b%02d@example.com", i)));
68        }
69
70        for (int seed = 0; seed < 100; seed++) {
71            Collections.shuffle(items, new Random(seed));
72            Collections.sort(items);
73        }
74    }
75
76    @Test
77    public void testCaseVariantNamesTieOnNameThenSortByJid() {
78        final var AliceAtB = contact("Alice", "b@example.com");
79        final var aliceAtA = contact("alice", "a@example.com");
80
81        Assert.assertTrue(aliceAtA.compareTo(AliceAtB) < 0);
82        Assert.assertTrue(AliceAtB.compareTo(aliceAtA) > 0);
83
84        final var AliceAtA = contact("Alice", "a@example.com");
85        Assert.assertTrue(AliceAtA.compareTo(AliceAtB) < 0);
86        Assert.assertTrue(AliceAtB.compareTo(AliceAtA) > 0);
87    }
88}