Added throws declarations for IOExceptions on Issue setters.
The FileIssue implementation now checks to ensure the success of the setters.
This commit is contained in:
parent
c39061f771
commit
b7670e69f3
@ -82,7 +82,7 @@
|
|||||||
classpathref="groovyc.classpath"/>
|
classpathref="groovyc.classpath"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="run-tests" depends="compile-tests">
|
<target name="test" depends="compile-tests">
|
||||||
<junit fork="yes" haltonfailure="yes">
|
<junit fork="yes" haltonfailure="yes">
|
||||||
<classpath refid="test.classpath"/>
|
<classpath refid="test.classpath"/>
|
||||||
<formatter type="brief" usefile="false" />
|
<formatter type="brief" usefile="false" />
|
||||||
@ -94,7 +94,7 @@
|
|||||||
</junit>
|
</junit>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="build" depends="compile,run-tests">
|
<target name="build" depends="compile,test">
|
||||||
<mkdir dir="${build.dir}/jar"/>
|
<mkdir dir="${build.dir}/jar"/>
|
||||||
<jar
|
<jar
|
||||||
destfile="${build.dir}/jar/pit-${application.version}.${build.number.final}.jar"
|
destfile="${build.dir}/jar/pit-${application.version}.${build.number.final}.jar"
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
|
#Wed, 19 May 2010 08:06:01 -0500
|
||||||
#Sat Apr 24 17:08:00 CDT 2010
|
#Sat Apr 24 17:08:00 CDT 2010
|
||||||
build.dir=build
|
build.dir=build
|
||||||
src.dir=src
|
src.dir=src
|
||||||
lib.shared.dir=../shared-libs
|
lib.shared.dir=../shared-libs
|
||||||
test.dir=test
|
test.dir=test
|
||||||
build.number=8
|
build.number=1
|
||||||
expected.application.version=2.3.0
|
expected.application.version=2.3.1
|
||||||
lib.dir=lib
|
lib.dir=lib
|
||||||
release.dir=release
|
release.dir=release
|
||||||
release.jar=pit-${application.version}.jar
|
release.jar=pit-${application.version}.jar
|
||||||
|
Binary file not shown.
BIN
libpit/release/pit-2.3.1.jar
Normal file
BIN
libpit/release/pit-2.3.1.jar
Normal file
Binary file not shown.
@ -23,31 +23,64 @@ public class FileIssue extends Issue {
|
|||||||
|
|
||||||
this.source = file
|
this.source = file
|
||||||
|
|
||||||
text = file.text
|
super.@text = file.text
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCategory(Category c) {
|
public void setCategory(Category c) throws IOException {
|
||||||
super.setCategory(c)
|
boolean renamed
|
||||||
source.renameTo(new File(source.canonicalFile.parentFile, getFilename()))
|
renamed = source.renameTo(new File(source.canonicalFile.parentFile,
|
||||||
|
makeFilename(id, c, status, priority)))
|
||||||
|
|
||||||
|
if (!renamed)
|
||||||
|
throw new IOException("I was unable to set the category. "
|
||||||
|
+ "I need to rename the file for this issue, but something is "
|
||||||
|
+ "preventing me from doing so (maybe the path to the file is "
|
||||||
|
+ "no longer valid, or maybe the file is currently open in "
|
||||||
|
+ "some other program).")
|
||||||
|
else super.setCategory(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(Status s) {
|
public void setStatus(Status s) throws IOException {
|
||||||
super.setStatus(s)
|
boolean renamed
|
||||||
source.renameTo(new File(source.canonicalFile.parentFile, getFilename()))
|
renamed = source.renameTo(new File(source.canonicalFile.parentFile,
|
||||||
|
makeFilename(id, category, s, priority)))
|
||||||
|
|
||||||
|
if (!renamed)
|
||||||
|
throw new IOException("I was unable to set the status. "
|
||||||
|
+ "I need to rename the file for this issue, but something is "
|
||||||
|
+ "preventing me from doing so (maybe the path to the file is "
|
||||||
|
+ "no longer valid, or maybe the file is currently open in "
|
||||||
|
+ "some other program).")
|
||||||
|
else super.setStatus(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPriority(int p) {
|
public void setPriority(int p) throws IOException {
|
||||||
super.setPriority(p)
|
boolean renamed
|
||||||
source.renameTo(new File(source.canonicalFile.parentFile, getFilename()))
|
renamed = source.renameTo(new File(source.canonicalFile.parentFile,
|
||||||
|
makeFilename(id, category, status, p)))
|
||||||
|
|
||||||
|
if (!renamed)
|
||||||
|
throw new IOException("I was unable to set the priority. "
|
||||||
|
+ "I need to rename the file for this issue, but something is "
|
||||||
|
+ "preventing me from doing so (maybe the path to the file is "
|
||||||
|
+ "no longer valid, or maybe the file is currently open in "
|
||||||
|
+ "some other program).")
|
||||||
|
else super.setPriority(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFilename() {
|
public String getFilename() {
|
||||||
return makeFilename(id, category, status, priority)
|
return makeFilename(id, category, status, priority)
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setText(String text) {
|
public void setText(String text) throws IOException {
|
||||||
|
try { source.write(text) }
|
||||||
|
catch (IOException ioe) {
|
||||||
|
throw new IOException("I could not save the new text for this "
|
||||||
|
+ "issue. I can not write to the file for this issue. I do not"
|
||||||
|
+ " know why, I am sorry (maybe the file can not be reached).")
|
||||||
|
}
|
||||||
|
|
||||||
super.setText(text)
|
super.setText(text)
|
||||||
source.write(text)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean delete() { return source.delete() }
|
public boolean delete() { return source.delete() }
|
||||||
|
@ -26,7 +26,7 @@ public abstract class Issue {
|
|||||||
|
|
||||||
public Category getCategory() { return category }
|
public Category getCategory() { return category }
|
||||||
|
|
||||||
public void setCategory(Category c) {
|
public void setCategory(Category c) throws IOException {
|
||||||
if (c == null)
|
if (c == null)
|
||||||
throw new IAE("Category cannot be null.")
|
throw new IAE("Category cannot be null.")
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ public abstract class Issue {
|
|||||||
|
|
||||||
public Status getStatus() { return status }
|
public Status getStatus() { return status }
|
||||||
|
|
||||||
public void setStatus(Status s) {
|
public void setStatus(Status s) throws IOException {
|
||||||
if (s == null)
|
if (s == null)
|
||||||
throw new IAE("Status cannot be null.")
|
throw new IAE("Status cannot be null.")
|
||||||
|
|
||||||
@ -44,13 +44,15 @@ public abstract class Issue {
|
|||||||
|
|
||||||
public int getPriority() { return priority }
|
public int getPriority() { return priority }
|
||||||
|
|
||||||
public void setPriority(int p) { priority = Math.min(9, Math.max(0, p)) }
|
public void setPriority(int p) throws IOException {
|
||||||
|
priority = Math.min(9, Math.max(0, p))
|
||||||
|
}
|
||||||
|
|
||||||
public String getTitle() { return text.readLines()[0] }
|
public String getTitle() { return text.readLines()[0] }
|
||||||
|
|
||||||
public String getText() { return text }
|
public String getText() { return text }
|
||||||
|
|
||||||
public void setText(String t) { text = t }
|
public void setText(String t) throws IOException { text = t }
|
||||||
|
|
||||||
public boolean hasDelivery() { return deliveryDate == null }
|
public boolean hasDelivery() { return deliveryDate == null }
|
||||||
|
|
||||||
|
@ -42,8 +42,13 @@ class FileIssueTest {
|
|||||||
assertEquals issues[0].category, Category.FEATURE
|
assertEquals issues[0].category, Category.FEATURE
|
||||||
assertEquals issues[1].category, Category.TASK
|
assertEquals issues[1].category, Category.TASK
|
||||||
|
|
||||||
|
try {
|
||||||
issues[0].category = Category.TASK
|
issues[0].category = Category.TASK
|
||||||
issues[1].category = Category.BUG
|
issues[1].category = Category.BUG
|
||||||
|
} catch (Exception e) {
|
||||||
|
Assert.fail("An unexpected Exception occurred: "
|
||||||
|
+ e.getLocalizedMessage())
|
||||||
|
}
|
||||||
|
|
||||||
assertEquals issues[0].category, Category.TASK
|
assertEquals issues[0].category, Category.TASK
|
||||||
assertEquals issues[1].category, Category.BUG
|
assertEquals issues[1].category, Category.BUG
|
||||||
@ -52,6 +57,27 @@ class FileIssueTest {
|
|||||||
assertTrue new File(testDir, '0002bs5.rst').exists()
|
assertTrue new File(testDir, '0002bs5.rst').exists()
|
||||||
assertFalse new File(testDir, '0001fn1.rst').exists()
|
assertFalse new File(testDir, '0001fn1.rst').exists()
|
||||||
assertFalse new File(testDir, '0002ts5.rst').exists()
|
assertFalse new File(testDir, '0002ts5.rst').exists()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test void testSetCategoryFails() {
|
||||||
|
FileInputStream fin
|
||||||
|
try {
|
||||||
|
// get a lock to the file to prevent the rename
|
||||||
|
def issueFile = new File('0001fn1.rst')
|
||||||
|
fin = new FileInputStream(issueFile)
|
||||||
|
|
||||||
|
// try to set the category
|
||||||
|
issues[0].category = Category.TASK
|
||||||
|
|
||||||
|
// should throw IOE before here
|
||||||
|
Assert.fail()
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
} catch (Exception e) {
|
||||||
|
Assert.fail("Unexpected exception: " + e.getLocalizedMessage())
|
||||||
|
} finally {
|
||||||
|
if (fin != null) fin.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test void testSetStatus() {
|
@Test void testSetStatus() {
|
||||||
@ -59,8 +85,13 @@ class FileIssueTest {
|
|||||||
assertEquals issues[0].status, Status.NEW
|
assertEquals issues[0].status, Status.NEW
|
||||||
assertEquals issues[1].status, Status.RESOLVED
|
assertEquals issues[1].status, Status.RESOLVED
|
||||||
|
|
||||||
|
try {
|
||||||
issues[0].status = Status.RESOLVED
|
issues[0].status = Status.RESOLVED
|
||||||
issues[1].status = Status.REJECTED
|
issues[1].status = Status.REJECTED
|
||||||
|
} catch (Exception e) {
|
||||||
|
Assert.fail("An unexpected Exception occurred: "
|
||||||
|
+ e.getLocalizedMessage())
|
||||||
|
}
|
||||||
|
|
||||||
assertTrue new File(testDir, '0001fs1.rst').exists()
|
assertTrue new File(testDir, '0001fs1.rst').exists()
|
||||||
assertTrue new File(testDir, '0002tj5.rst').exists()
|
assertTrue new File(testDir, '0002tj5.rst').exists()
|
||||||
@ -68,13 +99,38 @@ class FileIssueTest {
|
|||||||
assertFalse new File(testDir, '0002ts5.rst').exists()
|
assertFalse new File(testDir, '0002ts5.rst').exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test void testSetStatusFails() {
|
||||||
|
FileInputStream fin
|
||||||
|
try {
|
||||||
|
// get a lock to the file to prevent the rename
|
||||||
|
def issueFile = new File('0001fn1.rst')
|
||||||
|
fin = new FileInputStream(issueFile)
|
||||||
|
|
||||||
|
// try to set the status
|
||||||
|
issues[0].status = Status.REJECTED
|
||||||
|
|
||||||
|
// should throw IOE before here
|
||||||
|
Assert.fail()
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
} catch (Exception e) {
|
||||||
|
Assert.fail("Unexpected exception: " + e.getLocalizedMessage())
|
||||||
|
} finally {
|
||||||
|
if (fin != null) fin.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test void testSetPriority() {
|
@Test void testSetPriority() {
|
||||||
|
|
||||||
assertEquals issues[0].priority, 1
|
assertEquals issues[0].priority, 1
|
||||||
assertEquals issues[1].priority, 5
|
assertEquals issues[1].priority, 5
|
||||||
|
|
||||||
|
try {
|
||||||
issues[0].priority = 2
|
issues[0].priority = 2
|
||||||
issues[1].priority = 9
|
issues[1].priority = 9
|
||||||
|
} catch (Exception e) {
|
||||||
|
Assert.fail("An unexpected Exception occurred: "
|
||||||
|
+ e.getLocalizedMessage())
|
||||||
|
}
|
||||||
|
|
||||||
assertEquals issues[0].priority, 2
|
assertEquals issues[0].priority, 2
|
||||||
assertEquals issues[1].priority, 9
|
assertEquals issues[1].priority, 9
|
||||||
@ -85,6 +141,26 @@ class FileIssueTest {
|
|||||||
assertFalse new File(testDir, '0002ts5.rst').exists()
|
assertFalse new File(testDir, '0002ts5.rst').exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test void testSetPriorityFails() {
|
||||||
|
FileInputStream fin
|
||||||
|
try {
|
||||||
|
// get a lock to the file to prevent the rename
|
||||||
|
def issueFile = new File('0001fn1.rst')
|
||||||
|
fin = new FileInputStream(issueFile)
|
||||||
|
|
||||||
|
// try to set the priority
|
||||||
|
issues[0].priority = 9
|
||||||
|
|
||||||
|
// should throw IOE before here
|
||||||
|
Assert.fail()
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
} catch (Exception e) {
|
||||||
|
Assert.fail("Unexpected exception: " + e.getLocalizedMessage())
|
||||||
|
} finally {
|
||||||
|
if (fin != null) fin.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test void testConstruction() {
|
@Test void testConstruction() {
|
||||||
File issueFile = new File(testDir, '0001fn1.rst')
|
File issueFile = new File(testDir, '0001fn1.rst')
|
||||||
Issue issue = new FileIssue(issueFile)
|
Issue issue = new FileIssue(issueFile)
|
||||||
@ -100,6 +176,27 @@ class FileIssueTest {
|
|||||||
assertEquals issue.source , issueFile
|
assertEquals issue.source , issueFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test void testSetTextFails() {
|
||||||
|
try {
|
||||||
|
// make the issue file un-writable
|
||||||
|
def issueFile = new File('0001fn1.rst')
|
||||||
|
if (issueFile.setReadOnly()) {
|
||||||
|
|
||||||
|
// try to write something
|
||||||
|
issues[0].text = "This should fail to be written."
|
||||||
|
|
||||||
|
// should throw IOE before here
|
||||||
|
Assert.fail()
|
||||||
|
} else {
|
||||||
|
println "Could not run testSetTextFails, unable to change " +
|
||||||
|
"the test isseu file's permissions."
|
||||||
|
}
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
} catch (Exception e) {
|
||||||
|
Assert.fail("Unexpected exception: " + e.getLocalizedMessage())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test void testMakeFilename() {
|
@Test void testMakeFilename() {
|
||||||
assertEquals FileIssue.makeFilename('0001', Category.BUG,
|
assertEquals FileIssue.makeFilename('0001', Category.BUG,
|
||||||
Status.NEW, 5), '0001bn5.rst'
|
Status.NEW, 5), '0001bn5.rst'
|
||||||
|
Binary file not shown.
BIN
release/lib/pit-2.3.1.jar
Normal file
BIN
release/lib/pit-2.3.1.jar
Normal file
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
|||||||
application.version=2.3.0
|
application.version=2.3.1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user