mirror of
https://github.com/AppleCommander/AppleCommander.git
synced 2024-10-15 05:24:25 +00:00
Adding Range to better report a condensed description of differences.
This commit is contained in:
parent
9a0a034849
commit
fdb4a6d566
@ -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<Integer> unequalBlocks = new ArrayList<>();
|
||||
for (int block=0; block<orderA.getBlocksOnDevice(); block++) {
|
||||
byte[] blockA = orderA.readBlock(block);
|
||||
byte[] blockB = orderB.readBlock(block);
|
||||
if (!Arrays.equals(blockA, blockB)) {
|
||||
results.addError("Block #%d does not match.", block);
|
||||
unequalBlocks.add(block);
|
||||
}
|
||||
}
|
||||
for (Range r : Range.from(unequalBlocks)) {
|
||||
if (r.size() == 1) {
|
||||
results.addError("Block #%s does not match.", r);
|
||||
}
|
||||
else {
|
||||
results.addError("Blocks #%s do not match.", r);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -145,17 +156,20 @@ public class DiskDiff {
|
||||
}
|
||||
|
||||
for (int track=0; track<orderA.getTracksPerDisk(); track++) {
|
||||
List<String> unequalSectors = new ArrayList<>();
|
||||
List<Integer> unequalSectors = new ArrayList<>();
|
||||
for (int sector=0; sector<orderA.getSectorsPerTrack(); sector++) {
|
||||
byte[] sectorA = orderA.readSector(track, sector);
|
||||
byte[] sectorB = orderB.readSector(track, sector);
|
||||
if (!Arrays.equals(sectorA, sectorB)) {
|
||||
unequalSectors.add(Integer.toString(sector));
|
||||
unequalSectors.add(sector);
|
||||
}
|
||||
}
|
||||
if (!unequalSectors.isEmpty()) {
|
||||
results.addError("Track %d does not match on sectors %s", track,
|
||||
String.join(",", unequalSectors));
|
||||
Range.from(unequalSectors)
|
||||
.stream()
|
||||
.map(Range::toString)
|
||||
.collect(Collectors.joining(",")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* 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 java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Represents a range of numbers with helper methods to put them together.
|
||||
*/
|
||||
public class Range {
|
||||
private int first;
|
||||
private int last;
|
||||
|
||||
public Range(int first, int last) {
|
||||
if (first < last) {
|
||||
this.first = first;
|
||||
this.last = last;
|
||||
}
|
||||
else {
|
||||
this.first = last;
|
||||
this.last = first;
|
||||
}
|
||||
}
|
||||
|
||||
public int getFirst() {
|
||||
return first;
|
||||
}
|
||||
public int getLast() {
|
||||
return last;
|
||||
}
|
||||
public int size() {
|
||||
return last - first + 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (first == last) {
|
||||
return String.format("%d", first);
|
||||
}
|
||||
else {
|
||||
return String.format("%d-%d", first, last);
|
||||
}
|
||||
}
|
||||
|
||||
public static List<Range> from(List<Integer> numbers) {
|
||||
List<Range> 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;
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user