1   package com.atlassian.user.search.page;
2   
3   import junit.framework.TestCase;
4   
5   import java.util.ArrayList;
6   import java.util.Arrays;
7   import java.util.Iterator;
8   import java.util.List;
9   
10  public class TestMergedListPager extends TestCase
11  {
12      MergedListPager<Integer> pager;
13      Pager<Integer> pager1;
14      Pager<Integer> pager2;
15      Pager<Integer> pager3;
16      ArrayList<Pager<Integer>> pagers;
17  
18      public void setUp() throws Exception
19      {
20          pager1 = fillTo(0, 100);
21          pager2 = fillTo(100, 200);
22          pager3 = fillTo(200, 300);
23  
24          pagers = new ArrayList<Pager<Integer>>();
25          pagers.add(pager1);
26          pagers.add(pager2);
27          pagers.add(pager3);
28  
29          pager = new MergedListPager<Integer>(pagers);
30  
31          super.setUp();
32      }
33  
34      public void tearDown() throws Exception
35      {
36          super.tearDown();
37      }
38  
39      private Pager<Integer> fillTo(int beginningAt, int limit)
40      {
41          ArrayList<Integer> temp = new ArrayList<Integer>();
42  
43          for (int i = beginningAt; i != limit; i++)
44          {
45              temp.add(i);
46          }
47  
48          return new DefaultPager<Integer>(temp);
49      }
50  
51      public void testSkipTo() throws PagerException
52      {
53          assertEquals( new Integer(0), pager.getCurrentPage().get(0));
54          assertEquals( new Integer(99), pager.getCurrentPage().get(99));
55  
56          pager.skipTo(100);
57  
58          assertEquals(100, pager.getIndexOfFirstItemInCurrentPage());
59          assertEquals( new Integer(100), pager.getCurrentPage().get(0));
60          assertEquals( new Integer(199), pager.getCurrentPage().get(99));
61  
62          pager.skipTo(200);
63  
64          assertEquals(200, pager.getIndexOfFirstItemInCurrentPage());
65          assertEquals( new Integer(200), pager.getCurrentPage().get(0));
66          assertEquals( new Integer(299), pager.getCurrentPage().get(99));
67      }
68  
69      public void testOnLastPage() throws PagerException
70      {
71          pager.skipTo(101);
72          assertFalse(pager.onLastPage());
73  
74          pager.skipTo(201);
75          assertTrue(pager.onLastPage());
76  
77          pager.skipTo(300);
78          assertTrue(pager.onLastPage());
79      }
80  
81      public void testIterator()
82      {
83          ArrayList<Integer> data = new ArrayList<Integer>();
84  
85          for (Integer i : pager)
86          {
87              data.add(i);
88          }
89  
90          assertTrue(pager.onLastPage());
91  
92          assertEquals(300, data.size());
93          assertEquals(new Integer(0), data.get(0));
94          assertEquals(new Integer(100), data.get(100));
95          assertEquals(new Integer(200), data.get(200));
96          assertEquals(new Integer(299), data.get(299));
97      }
98  
99      public void testGetCurrentPage()
100     {
101         List<String> results1 = new ArrayList<String>();
102 
103         for (int i = 0; i < 45; i++)
104         {
105             results1.add(String.valueOf(i));
106         }
107 
108         List<String> results2 = new ArrayList<String>();
109         for (int i = 45; i < 110; i++)
110         {
111             results2.add(String.valueOf(i));
112         }
113 
114         DefaultPager<String> pagerOne = new DefaultPager<String>(results1);
115         DefaultPager<String> pagerTwo = new DefaultPager<String>(results2);
116         MergedListPager<String> pager = new MergedListPager<String>(Arrays.asList(pagerOne, pagerTwo));
117 
118         assertEquals(Pager.PRELOAD_LIMIT, pager.getCurrentPage().size());
119     }
120 
121     public void testWithMockLDAPPagers()
122     {
123         List mockLDAPPagers = new ArrayList();
124 
125         int total = 0;
126         for (int i = 1; i < 20; i++)
127         {
128             mockLDAPPagers.add(new MockLDAPPager(createDataset(i, total)));
129             total += i;
130         }
131         for (int i = 20; i < 500; i+=31) /* test some weird numbers, not just 100, 110, etc. */
132         {
133             mockLDAPPagers.add(new MockLDAPPager(createDataset(i, total)));
134             total += i;
135         }
136 
137         MergedListPager mergedPager = new MergedListPager(mockLDAPPagers);
138 
139         Iterator iterator = mergedPager.iterator();
140         for (int i = 1; i <= total; i++)
141         {
142             try
143             {
144                 assertTrue("Able to fetch " + i + " value of " + total, iterator.hasNext());
145                 MockSearchResult result = (MockSearchResult) iterator.next();
146                 assertEquals(String.valueOf(i), result.getName());
147             }
148             catch (Exception e)
149             {
150                 fail("Fail on i = " + i + ": " + e);
151             }
152         }
153         assertFalse(iterator.hasNext());
154     }
155 
156     private List<String> createDataset(int size, int start)
157     {
158         List<String> result = new ArrayList<String>(size);
159         for (int i = 1; i <= size; i++)
160             result.add(String.valueOf(start + i));
161         return result;
162     }
163 
164     public void testNextPage()
165     {
166         pager.nextPage();
167         assertEquals(new Integer(100), pager.getCurrentPage().get(0));
168 
169         pager.nextPage();
170         assertEquals(new Integer(200), pager.getCurrentPage().get(0));
171     }
172 }