Add tests for equals, hashCode and toString

This commit is contained in:
2017-07-24 11:41:12 -04:00
parent 864636705d
commit f3a64fd67a
19 changed files with 189 additions and 142 deletions

View File

@@ -25,6 +25,7 @@ dependencies {
testImplementation 'org.mockito:mockito-core:2.8.9' testImplementation 'org.mockito:mockito-core:2.8.9'
testImplementation 'org.json:json:20160810' testImplementation 'org.json:json:20160810'
testImplementation 'org.xerial:sqlite-jdbc:3.18.0' testImplementation 'org.xerial:sqlite-jdbc:3.18.0'
testImplementation 'nl.jqno.equalsverifier:equalsverifier:2.3.1'
implementation('com.opencsv:opencsv:3.9') { implementation('com.opencsv:opencsv:3.9') {
exclude group: 'commons-logging', module: 'commons-logging' exclude group: 'commons-logging', module: 'commons-logging'

View File

@@ -348,7 +348,7 @@ public abstract class CheckmarkList
add(buildCheckmarksFromIntervals(reps, intervals)); add(buildCheckmarksFromIntervals(reps, intervals));
} }
static class Interval static final class Interval
{ {
final Timestamp begin; final Timestamp begin;

View File

@@ -353,7 +353,7 @@ public class Habit
data.position = newPosition; data.position = newPosition;
} }
public static class HabitData public static final class HabitData
{ {
@NonNull @NonNull
public String name; public String name;
@@ -471,4 +471,13 @@ public class Habit
.toHashCode(); .toHashCode();
} }
} }
@Override
public String toString()
{
return new ToStringBuilder(this)
.append("id", id)
.append("data", data)
.toString();
}
} }

View File

@@ -19,10 +19,6 @@
package org.isoron.uhabits.core.models; package org.isoron.uhabits.core.models;
import android.support.annotation.*;
import java.util.*;
public class HabitMatcher public class HabitMatcher
{ {
public static final HabitMatcher WITH_ALARM = new HabitMatcherBuilder() public static final HabitMatcher WITH_ALARM = new HabitMatcherBuilder()
@@ -36,22 +32,13 @@ public class HabitMatcher
private final boolean completedAllowed; private final boolean completedAllowed;
private final List<Integer> allowedColors;
public HabitMatcher(boolean allowArchived, public HabitMatcher(boolean allowArchived,
boolean reminderRequired, boolean reminderRequired,
boolean completedAllowed, boolean completedAllowed)
@NonNull List<Integer> allowedColors)
{ {
this.archivedAllowed = allowArchived; this.archivedAllowed = allowArchived;
this.reminderRequired = reminderRequired; this.reminderRequired = reminderRequired;
this.completedAllowed = completedAllowed; this.completedAllowed = completedAllowed;
this.allowedColors = allowedColors;
}
public List<Integer> getAllowedColors()
{
return allowedColors;
} }
public boolean isArchivedAllowed() public boolean isArchivedAllowed()
@@ -74,7 +61,6 @@ public class HabitMatcher
if (!isArchivedAllowed() && habit.isArchived()) return false; if (!isArchivedAllowed() && habit.isArchived()) return false;
if (isReminderRequired() && !habit.hasReminder()) return false; if (isReminderRequired() && !habit.hasReminder()) return false;
if (!isCompletedAllowed() && habit.isCompletedToday()) return false; if (!isCompletedAllowed() && habit.isCompletedToday()) return false;
if (!allowedColors.contains(habit.getColor())) return false;
return true; return true;
} }
} }

View File

@@ -19,10 +19,6 @@
package org.isoron.uhabits.core.models; package org.isoron.uhabits.core.models;
import org.isoron.uhabits.core.utils.*;
import java.util.*;
public class HabitMatcherBuilder public class HabitMatcherBuilder
{ {
private boolean archivedAllowed = false; private boolean archivedAllowed = false;
@@ -31,20 +27,10 @@ public class HabitMatcherBuilder
private boolean completedAllowed = true; private boolean completedAllowed = true;
private List<Integer> allowedColors = allColors();
private static List<Integer> allColors()
{
List<Integer> colors = new ArrayList<>();
for(int i = 0; i < ColorConstants.CSV_PALETTE.length; i++)
colors.add(i);
return colors;
}
public HabitMatcher build() public HabitMatcher build()
{ {
return new HabitMatcher(archivedAllowed, reminderRequired, return new HabitMatcher(archivedAllowed, reminderRequired,
completedAllowed, allowedColors); completedAllowed);
} }
public HabitMatcherBuilder setArchivedAllowed(boolean archivedAllowed) public HabitMatcherBuilder setArchivedAllowed(boolean archivedAllowed)
@@ -53,12 +39,6 @@ public class HabitMatcherBuilder
return this; return this;
} }
public HabitMatcherBuilder setAllowedColors(List<Integer> allowedColors)
{
this.allowedColors = allowedColors;
return this;
}
public HabitMatcherBuilder setCompletedAllowed(boolean completedAllowed) public HabitMatcherBuilder setCompletedAllowed(boolean completedAllowed)
{ {
this.completedAllowed = completedAllowed; this.completedAllowed = completedAllowed;

View File

@@ -20,19 +20,4 @@
package org.isoron.uhabits.core.models; package org.isoron.uhabits.core.models;
public class HabitNotFoundException extends RuntimeException { public class HabitNotFoundException extends RuntimeException {
public HabitNotFoundException() {
super();
}
public HabitNotFoundException(String message) {
super(message);
}
public HabitNotFoundException(Throwable cause) {
super(cause);
}
public HabitNotFoundException(String message, Throwable cause) {
super(message, cause);
}
} }

View File

@@ -93,4 +93,28 @@ public final class Score
.append("value", value) .append("value", value)
.toString(); .toString();
} }
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Score score = (Score) o;
return new EqualsBuilder()
.append(value, score.value)
.append(timestamp, score.timestamp)
.isEquals();
}
@Override
public int hashCode()
{
return new HashCodeBuilder(17, 37)
.append(timestamp)
.append(value)
.toHashCode();
}
} }

View File

@@ -69,4 +69,28 @@ public final class Streak
.append("end", end) .append("end", end)
.toString(); .toString();
} }
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Streak streak = (Streak) o;
return new EqualsBuilder()
.append(start, streak.start)
.append(end, streak.end)
.isEquals();
}
@Override
public int hashCode()
{
return new HashCodeBuilder(17, 37)
.append(start)
.append(end)
.toHashCode();
}
} }

View File

@@ -25,7 +25,7 @@ import java.util.*;
import static java.util.Calendar.DAY_OF_WEEK; import static java.util.Calendar.DAY_OF_WEEK;
public class Timestamp public final class Timestamp
{ {
public static final long DAY_LENGTH = 86400000; public static final long DAY_LENGTH = 86400000;

View File

@@ -23,7 +23,7 @@ import org.apache.commons.lang3.builder.*;
import java.util.*; import java.util.*;
public class WeekdayList public final class WeekdayList
{ {
public static final WeekdayList EVERY_DAY = new WeekdayList(127); public static final WeekdayList EVERY_DAY = new WeekdayList(127);

View File

@@ -74,13 +74,6 @@ public class SQLiteHabitList extends HabitList
} }
} }
public static SQLiteHabitList getInstance(
@NonNull ModelFactory modelFactory)
{
if (instance == null) instance = new SQLiteHabitList(modelFactory);
return instance;
}
@Override @Override
public synchronized void add(@NonNull Habit habit) public synchronized void add(@NonNull Habit habit)
{ {

View File

@@ -21,7 +21,6 @@
package org.isoron.uhabits.core.models.sqlite.records; package org.isoron.uhabits.core.models.sqlite.records;
import org.apache.commons.lang3.builder.*;
import org.isoron.uhabits.core.database.*; import org.isoron.uhabits.core.database.*;
import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.models.*;
@@ -129,78 +128,4 @@ public class HabitRecord
new WeekdayList(reminderDays))); new WeekdayList(reminderDays)));
} }
} }
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
HabitRecord that = (HabitRecord) o;
return new EqualsBuilder()
.appendSuper(super.equals(o))
.append(freqNum, that.freqNum)
.append(freqDen, that.freqDen)
.append(color, that.color)
.append(position, that.position)
.append(reminderDays, that.reminderDays)
.append(highlight, that.highlight)
.append(archived, that.archived)
.append(type, that.type)
.append(targetValue, that.targetValue)
.append(targetType, that.targetType)
.append(name, that.name)
.append(description, that.description)
.append(reminderHour, that.reminderHour)
.append(reminderMin, that.reminderMin)
.append(unit, that.unit)
.isEquals();
}
@Override
public int hashCode()
{
return new HashCodeBuilder(17, 37)
.appendSuper(super.hashCode())
.append(name)
.append(description)
.append(freqNum)
.append(freqDen)
.append(color)
.append(position)
.append(reminderHour)
.append(reminderMin)
.append(reminderDays)
.append(highlight)
.append(archived)
.append(type)
.append(targetValue)
.append(targetType)
.append(unit)
.toHashCode();
}
@Override
public String toString()
{
return new ToStringBuilder(this)
.append("name", name)
.append("description", description)
.append("freqNum", freqNum)
.append("freqDen", freqDen)
.append("color", color)
.append("position", position)
.append("reminderHour", reminderHour)
.append("reminderMin", reminderMin)
.append("reminderDays", reminderDays)
.append("highlight", highlight)
.append("archived", archived)
.append("type", type)
.append("targetValue", targetValue)
.append("targetType", targetType)
.append("unit", unit)
.toString();
}
} }

View File

@@ -28,4 +28,9 @@ public class StringUtils
{ {
return new BigInteger(260, new Random()).toString(32).substring(0, 32); return new BigInteger(260, new Random()).toString(32).substring(0, 32);
} }
public static String removePointers(String original)
{
return original.replaceAll("@[0-9a-f]*", "@00000000");
}
} }

View File

@@ -26,9 +26,12 @@ import org.junit.*;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import nl.jqno.equalsverifier.*;
import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.core.IsEqual.*; import static org.hamcrest.core.IsEqual.*;
import static org.isoron.uhabits.core.models.Checkmark.*; import static org.isoron.uhabits.core.models.Checkmark.*;
import static org.isoron.uhabits.core.utils.StringUtils.removePointers;
public class CheckmarkListTest extends BaseUnitTest public class CheckmarkListTest extends BaseUnitTest
{ {
@@ -351,4 +354,34 @@ public class CheckmarkListTest extends BaseUnitTest
DateUtils.setFixedLocalTime( DateUtils.setFixedLocalTime(
FIXED_LOCAL_TIME + days * Timestamp.DAY_LENGTH); FIXED_LOCAL_TIME + days * Timestamp.DAY_LENGTH);
} }
@Test
public void testToString() throws Exception
{
Timestamp t = Timestamp.ZERO.plus(100);
Checkmark checkmark = new Checkmark(t, 2);
String s = removePointers(checkmark.toString());
assertThat(s, equalTo(
"org.isoron.uhabits.core.models.Checkmark@00000000[" +
"timestamp=org.isoron.uhabits.core.models.Timestamp@00000000[unixTime=8640000000]," +
"value=2]"));
CheckmarkList.Interval interval =
new CheckmarkList.Interval(t, t.plus(1), t.plus(2));
s = removePointers(interval.toString());
assertThat(s, equalTo(
"org.isoron.uhabits.core.models.CheckmarkList$Interval@00000000[" +
"begin=org.isoron.uhabits.core.models.Timestamp@00000000[unixTime=8640000000]," +
"center=org.isoron.uhabits.core.models.Timestamp@00000000[unixTime=8726400000]," +
"end=org.isoron.uhabits.core.models.Timestamp@00000000[unixTime=8812800000]]"));
}
@Test
public void testEquals() throws Exception
{
EqualsVerifier.forClass(Checkmark.class).verify();
EqualsVerifier.forClass(Timestamp.class).verify();
EqualsVerifier.forClass(CheckmarkList.Interval.class).verify();
}
} }

View File

@@ -23,8 +23,11 @@ import org.isoron.uhabits.core.*;
import org.junit.*; import org.junit.*;
import org.junit.rules.*; import org.junit.rules.*;
import nl.jqno.equalsverifier.*;
import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.CoreMatchers.*;
import static org.isoron.uhabits.core.utils.DateUtils.*; import static org.isoron.uhabits.core.utils.DateUtils.*;
import static org.isoron.uhabits.core.utils.StringUtils.removePointers;
import static org.junit.Assert.*; import static org.junit.Assert.*;
public class HabitTest extends BaseUnitTest public class HabitTest extends BaseUnitTest
@@ -126,4 +129,43 @@ public class HabitTest extends BaseUnitTest
assertThat(h.getUriString(), assertThat(h.getUriString(),
equalTo("content://org.isoron.uhabits/habit/0")); equalTo("content://org.isoron.uhabits/habit/0"));
} }
@Test
public void testEquals() throws Exception
{
EqualsVerifier
.forClass(Habit.HabitData.class)
.suppress(Warning.NONFINAL_FIELDS)
.verify();
EqualsVerifier.forClass(Repetition.class).verify();
EqualsVerifier.forClass(Score.class).verify();
EqualsVerifier.forClass(Streak.class).verify();
EqualsVerifier.forClass(Reminder.class).verify();
EqualsVerifier.forClass(WeekdayList.class).verify();
}
@Test
public void testToString() throws Exception
{
Habit h = modelFactory.buildHabit();
h.setReminder(new Reminder(22, 30, WeekdayList.EVERY_DAY));
String s = removePointers(h.toString());
String expected =
"org.isoron.uhabits.core.models.Habit@00000000[" +
"id=<null>," +
"data=org.isoron.uhabits.core.models.Habit$HabitData@00000000[" +
"name=,description=," +
"frequency=org.isoron.uhabits.core.models.Frequency@00000000[numerator=3,denominator=7]," +
"color=8,archived=false,targetType=0,targetValue=100.0,type=0,unit=," +
"reminder=org.isoron.uhabits.core.models.Reminder@00000000[" +
"hour=22,minute=30," +
"days=org.isoron.uhabits.core.models.WeekdayList@00000000[" +
"weekdays={true,true,true,true,true,true,true}]]," +
"position=0]]";
assertThat(s, equalTo(expected));
}
} }

View File

@@ -30,6 +30,7 @@ import java.util.*;
import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertFalse;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsEqual.*; import static org.hamcrest.core.IsEqual.*;
import static org.isoron.uhabits.core.utils.StringUtils.removePointers;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
@@ -186,4 +187,15 @@ public class RepetitionListTest extends BaseUnitTest
verify(listener, times(2)).onModelChange(); verify(listener, times(2)).onModelChange();
reset(listener); reset(listener);
} }
@Test
public void testToString() throws Exception
{
Repetition rep = new Repetition(Timestamp.ZERO.plus(100), 20);
String s = removePointers(rep.toString());
assertThat(s, equalTo(
"org.isoron.uhabits.core.models.Repetition@00000000[" +
"timestamp=org.isoron.uhabits.core.models.Timestamp@00000000[unixTime=8640000000]," +
"value=20]"));
}
} }

View File

@@ -26,8 +26,8 @@ import org.junit.*;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.core.IsEqual.*;
import static org.hamcrest.number.IsCloseTo.*; import static org.hamcrest.number.IsCloseTo.*;
public class ScoreListTest extends BaseUnitTest public class ScoreListTest extends BaseUnitTest

View File

@@ -22,9 +22,12 @@ package org.isoron.uhabits.core.models;
import org.isoron.uhabits.core.*; import org.isoron.uhabits.core.*;
import org.junit.*; import org.junit.*;
import static org.hamcrest.number.IsCloseTo.*; import static org.hamcrest.MatcherAssert.assertThat;
import static org.isoron.uhabits.core.models.Score.*; import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.*; import static org.hamcrest.number.IsCloseTo.closeTo;
import static org.isoron.uhabits.core.models.Score.compute;
import static org.isoron.uhabits.core.utils.StringUtils.removePointers;
public class ScoreTest extends BaseUnitTest public class ScoreTest extends BaseUnitTest
{ {
@@ -66,4 +69,16 @@ public class ScoreTest extends BaseUnitTest
assertThat(compute(freq, 0.5, check), closeTo(0.491192, E)); assertThat(compute(freq, 0.5, check), closeTo(0.491192, E));
assertThat(compute(freq, 0.75, check), closeTo(0.736788, E)); assertThat(compute(freq, 0.75, check), closeTo(0.736788, E));
} }
@Test
public void testToString() throws Exception
{
Score score = new Score(Timestamp.ZERO.plus(100), 150.0);
String string = removePointers(score.toString());
assertThat(string, equalTo(
"org.isoron.uhabits.core.models.Score@00000000[" +
"timestamp=org.isoron.uhabits.core.models.Timestamp@00000000[unixTime=8640000000]," +
"value=150.0]"));
}
} }

View File

@@ -26,8 +26,9 @@ import org.junit.*;
import java.util.*; import java.util.*;
import static junit.framework.TestCase.*; import static junit.framework.TestCase.*;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.core.IsEqual.*;
import static org.isoron.uhabits.core.utils.StringUtils.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
public class StreakListTest extends BaseUnitTest public class StreakListTest extends BaseUnitTest
@@ -117,4 +118,16 @@ public class StreakListTest extends BaseUnitTest
s = streaks.getNewestComputed(); s = streaks.getNewestComputed();
assertNull(s); assertNull(s);
} }
@Test
public void testToString() throws Exception
{
Timestamp time = Timestamp.ZERO.plus(100);
Streak streak = new Streak(time, time.plus(10));
String string = removePointers(streak.toString());
assertThat(string, equalTo(
"org.isoron.uhabits.core.models.Streak@00000000[" +
"start=org.isoron.uhabits.core.models.Timestamp@00000000[unixTime=8640000000]," +
"end=org.isoron.uhabits.core.models.Timestamp@00000000[unixTime=9504000000]]"));
}
} }