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}