diff --git a/app/src/main/java/com/maxistar/textpad/service/RecentFilesService.java b/app/src/main/java/com/maxistar/textpad/service/RecentFilesService.java index a481c63..9402400 100644 --- a/app/src/main/java/com/maxistar/textpad/service/RecentFilesService.java +++ b/app/src/main/java/com/maxistar/textpad/service/RecentFilesService.java @@ -31,30 +31,23 @@ public RecentFilesService() { public void addRecentFile(String url, Context context) { loadItems(context); - //items.remove(url); - items.add(url); - removeOldestItems(url); - + items = addRecentFile(items, url); saveRecentFiles(items, context); } - private void removeOldestItems(String url) { - ArrayList newItems = new ArrayList<>(); - int counter = 0; - int lastIndex = items.size(); - int skip = items.size() - MAX_ELEMENTS_STORED; - for(String item: items) { - counter++; - if (counter != lastIndex && item.equals(url)) { - continue; - } - if (counter <= skip) { - continue; - } - newItems.add(item); + static ArrayList addRecentFile(ArrayList items, String url) { + ArrayList newItems = new ArrayList<>(items); + while (newItems.remove(url)) { + // Remove all previous occurrences before appending the latest entry. + } + newItems.add(url); + + while (newItems.size() > MAX_ELEMENTS_STORED) { + newItems.remove(0); } - this.items = newItems; + + return newItems; } private void loadItems(Context context) { @@ -72,6 +65,10 @@ private void loadItems(Context context) { */ public ArrayList getLastFiles(int skip, Context context) { loadItems(context); + return getLastFiles(items, skip); + } + + static ArrayList getLastFiles(ArrayList items, int skip) { ArrayList result = new ArrayList<>(); int counter = 0; ListIterator it = items.listIterator(items.size()); @@ -82,8 +79,8 @@ public ArrayList getLastFiles(int skip, Context context) { if (counter <= skip) { continue; } - if (counter > MAX_ELEMENTS_SHOWN + 1) { - continue; + if (result.size() >= MAX_ELEMENTS_SHOWN) { + break; } result.add(name); diff --git a/app/src/test/java/com/maxistar/textpad/service/RecentFilesServiceTest.java b/app/src/test/java/com/maxistar/textpad/service/RecentFilesServiceTest.java new file mode 100644 index 0000000..a480421 --- /dev/null +++ b/app/src/test/java/com/maxistar/textpad/service/RecentFilesServiceTest.java @@ -0,0 +1,89 @@ +package com.maxistar.textpad.service; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RecentFilesServiceTest { + @Test + public void addingDuplicateMovesItToNewestPosition() { + ArrayList items = list("url1", "url2", "url3"); + + ArrayList result = RecentFilesService.addRecentFile(items, "url2"); + + assertEquals(list("url1", "url3", "url2"), result); + } + + @Test + public void addingDuplicateLeavesOnlyOneOccurrence() { + ArrayList items = list("url1", "url2", "url3", "url2"); + + ArrayList result = RecentFilesService.addRecentFile(items, "url2"); + + assertEquals(list("url1", "url3", "url2"), result); + } + + @Test + public void trimmingRemovesOnlyOldestEntries() { + ArrayList items = list( + "url1", "url2", "url3", "url4", "url5", + "url6", "url7", "url8", "url9", "url10" + ); + + ArrayList result = RecentFilesService.addRecentFile(items, "url11"); + + assertEquals(list( + "url2", "url3", "url4", "url5", "url6", + "url7", "url8", "url9", "url10", "url11" + ), result); + } + + @Test + public void duplicateRemovalHappensBeforeTrimming() { + ArrayList items = list( + "url1", "url2", "url3", "url4", "url5", + "url6", "url7", "url8", "url9", "url10" + ); + + ArrayList result = RecentFilesService.addRecentFile(items, "url2"); + + assertEquals(list( + "url1", "url3", "url4", "url5", "url6", + "url7", "url8", "url9", "url10", "url2" + ), result); + } + + @Test + public void lastFilesAreReturnedNewestFirst() { + ArrayList items = list("url1", "url2", "url3", "url4"); + + ArrayList result = RecentFilesService.getLastFiles(items, 0); + + assertEquals(list("url4", "url3", "url2", "url1"), result); + } + + @Test + public void lastFilesRespectSkipArgument() { + ArrayList items = list("url1", "url2", "url3", "url4"); + + ArrayList result = RecentFilesService.getLastFiles(items, 1); + + assertEquals(list("url3", "url2", "url1"), result); + } + + @Test + public void lastFilesRespectDisplayLimit() { + ArrayList items = list("url1", "url2", "url3", "url4", "url5", "url6", "url7"); + + ArrayList result = RecentFilesService.getLastFiles(items, 0); + + assertEquals(list("url7", "url6", "url5", "url4", "url3"), result); + } + + private ArrayList list(String... values) { + return new ArrayList<>(Arrays.asList(values)); + } +}