From 977ef553250d84baa7d2a6e8f78ad43fd6908bb0 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Thu, 29 Apr 2021 21:05:32 +0200
Subject: [PATCH] #564 - sort categories naturally

---
 pom.xml                                       |  5 +++++
 .../categories/CategoryService.java           | 14 +++++++------
 .../unit/CategoryServiceTest.java             | 20 +++++++++++++++----
 3 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/pom.xml b/pom.xml
index 941f0527c..784f19a4e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -202,6 +202,11 @@
             <artifactId>org.eclipse.jgit</artifactId>
             <version>${jgit.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.padler</groupId>
+            <artifactId>natorder</artifactId>
+            <version>1.0.1</version>
+        </dependency>
 
         <!-- selenium -->
         <dependency>
diff --git a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java
index 3e2ffa459..c9be23a3c 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/categories/CategoryService.java
@@ -4,11 +4,13 @@ import de.deadlocker8.budgetmaster.services.Resetable;
 import de.deadlocker8.budgetmaster.transactions.Transaction;
 import de.deadlocker8.budgetmaster.utils.Strings;
 import de.thecodelabs.utils.util.Localization;
+import org.padler.natorder.NaturalOrderComparator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Optional;
@@ -101,16 +103,16 @@ public class CategoryService implements Resetable
 	public List<Category> getAllCategories()
 	{
 		localizeDefaultCategories();
-		return categoryRepository.findAllByOrderByNameAsc().stream()
-				.sorted(Comparator.comparing(c -> c.getName().toLowerCase()))
-				.collect(Collectors.toList());
+		final List<Category> categories = categoryRepository.findAllByOrderByNameAsc();
+		categories.sort((c1, c2) -> new NaturalOrderComparator().compare(c1.getName(), c2.getName()));
+		return categories;
 	}
 
 	public List<Category> getAllCustomCategories()
 	{
-		return categoryRepository.findAllByTypeOrderByNameAsc(CategoryType.CUSTOM).stream()
-				.sorted(Comparator.comparing(c -> c.getName().toLowerCase()))
-				.collect(Collectors.toList());
+		final List<Category> categories = categoryRepository.findAllByTypeOrderByNameAsc(CategoryType.CUSTOM);
+		categories.sort((c1, c2) -> new NaturalOrderComparator().compare(c1.getName(), c2.getName()));
+		return categories;
 	}
 
 	public void localizeDefaultCategories()
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/CategoryServiceTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/CategoryServiceTest.java
index be0d6e228..97cad2071 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/CategoryServiceTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/CategoryServiceTest.java
@@ -44,8 +44,17 @@ public class CategoryServiceTest
 		Category category_AA = new Category("AA", "#ff0000", CategoryType.CUSTOM);
 		categories.add(category_AA);
 
-		Category category_0 = new Category("0", "#ff0000", CategoryType.CUSTOM);
-		categories.add(category_0);
+		Category category_1 = new Category("1", "#ff0000", CategoryType.CUSTOM);
+		categories.add(category_1);
+
+		Category category_11 = new Category("11", "#ff0000", CategoryType.CUSTOM);
+		categories.add(category_11);
+
+		Category category_2 = new Category("2", "#ff0000", CategoryType.CUSTOM);
+		categories.add(category_2);
+
+		Category category_AABB = new Category("AABB", "#ff0000", CategoryType.CUSTOM);
+		categories.add(category_AABB);
 
 		Category category_aa = new Category("aa", "#ff0000", CategoryType.CUSTOM);
 		categories.add(category_aa);
@@ -54,8 +63,11 @@ public class CategoryServiceTest
 		Mockito.when(categoryRepository.findByType(CategoryType.REST)).thenReturn(CATEGORY_REST);
 		Mockito.when(categoryRepository.findAllByOrderByNameAsc()).thenReturn(categories);
 
-		assertThat(categoryService.getAllCategories()).hasSize(6)
-				.containsExactly(category_0, category_AA, category_aa, category_BB, CATEGORY_NONE, CATEGORY_REST);
+		System.out.println(List.of(category_1, category_2, category_11, category_AA, category_aa, category_AABB, category_BB, CATEGORY_NONE, CATEGORY_REST));
+		System.out.println(categoryService.getAllCategories());
+
+		assertThat(categoryService.getAllCategories()).hasSize(9)
+				.containsExactly(category_1, category_2, category_11, category_AA, category_aa, category_AABB, category_BB, CATEGORY_NONE, CATEGORY_REST);
 	}
 
 	@Test
-- 
GitLab