From fdb4a6d5660ffd85668b73818bccae719c44a491 Mon Sep 17 00:00:00 2001 From: Rob Greene Date: Mon, 14 Mar 2022 20:15:51 -0500 Subject: [PATCH] Adding Range to better report a condensed description of differences. --- .../storage/compare/DiskDiff.java | 24 +++-- .../webcodepro/applecommander/util/Range.java | 89 +++++++++++++++++++ .../applecommander/util/RangeTest.java | 49 ++++++++++ 3 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 lib/ac-api/src/main/java/com/webcodepro/applecommander/util/Range.java create mode 100644 lib/ac-api/src/test/java/com/webcodepro/applecommander/util/RangeTest.java diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/compare/DiskDiff.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/compare/DiskDiff.java index e580a93..ba3e9d2 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/compare/DiskDiff.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/compare/DiskDiff.java @@ -24,12 +24,14 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.function.BiConsumer; +import java.util.stream.Collectors; import com.webcodepro.applecommander.storage.Disk; import com.webcodepro.applecommander.storage.DiskGeometry; import com.webcodepro.applecommander.storage.DiskUnrecognizedException; import com.webcodepro.applecommander.storage.FormattedDisk; import com.webcodepro.applecommander.storage.physical.ImageOrder; +import com.webcodepro.applecommander.util.Range; /** * Perform a disk comparison based on selected strategy. @@ -123,12 +125,21 @@ public class DiskDiff { orderA.getBlocksOnDevice(), orderB.getBlocksOnDevice()); return; } - + + List unequalBlocks = new ArrayList<>(); for (int block=0; block unequalSectors = new ArrayList<>(); + List unequalSectors = new ArrayList<>(); for (int sector=0; sector from(List numbers) { + List ranges = new ArrayList<>(); + Collections.sort(numbers); + + int first = -1; + int last = -1; + for (int number : numbers) { + if (first == -1) { + first = last = number; + } + else if (number == last+1) { + last = number; + } + else { + ranges.add(new Range(first, last)); + first = last = number; + } + } + + if (first != -1) { + ranges.add(new Range(first, last)); + } + + return ranges; + } +} diff --git a/lib/ac-api/src/test/java/com/webcodepro/applecommander/util/RangeTest.java b/lib/ac-api/src/test/java/com/webcodepro/applecommander/util/RangeTest.java new file mode 100644 index 0000000..1e7f4bb --- /dev/null +++ b/lib/ac-api/src/test/java/com/webcodepro/applecommander/util/RangeTest.java @@ -0,0 +1,49 @@ +/* + * AppleCommander - An Apple ][ image utility. + * Copyright (C) 2002-2022 by Robert Greene and others + * robgreene at users.sourceforge.net + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.webcodepro.applecommander.util; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; + +import org.junit.Test; + +public class RangeTest { + @Test + public void testToString() { + assertEquals("1", new Range(1,1).toString()); + assertEquals("1-5", new Range(1,5).toString()); + } + + @Test + public void testFrom() { + assertEquals("[1-3, 5, 7, 9-12]", Range.from(Arrays.asList(1,2,3,5,7,9,10,11,12)).toString()); + } + + @Test + public void testFromUnordered() { + assertEquals("[1-3, 5, 7, 9-12]", Range.from(Arrays.asList(9,10,1,5,2,12,3,11,7)).toString()); + } + + @Test + public void testFromEmpty() { + assertEquals("[]", Range.from(Arrays.asList()).toString()); + } +}