forked from trifork/erjang
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
added EObjectIterator and made ECons Iterable
- Loading branch information
1 parent
5b64643
commit f437f8f
Showing
3 changed files
with
254 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
package erjang; | ||
|
||
import java.util.Iterator; | ||
import java.util.NoSuchElementException; | ||
|
||
|
||
public class EObjectIterator implements Iterator<EObject> { | ||
private EObject object = null; | ||
|
||
public EObjectIterator(EObject object) { | ||
this.object = object; | ||
} | ||
|
||
/* (non-Javadoc) | ||
* @see java.util.Iterator#hasNext() | ||
*/ | ||
public boolean hasNext() { | ||
if (object == null) { | ||
return false; | ||
} | ||
return !object.isNil(); | ||
} | ||
|
||
/* (non-Javadoc) | ||
* @see java.util.Iterator#next() | ||
*/ | ||
public EObject next() { | ||
if ((object == null) | ||
|| object.isNil()) { | ||
throw new NoSuchElementException(); | ||
} | ||
|
||
EObject next; | ||
|
||
ECons cons = object.testCons(); | ||
if ((cons != null) | ||
// TODO how to handle EString? return each character? Or return it as single element only? | ||
// for now we don't treat EString as collection, but as single element | ||
&& !(cons instanceof EString)) { | ||
next = cons.head(); | ||
object = cons.tail(); | ||
} | ||
else { | ||
// simple object, return it and set next object to null | ||
next = object; | ||
object = null; | ||
} | ||
return next; | ||
} | ||
|
||
/* (non-Javadoc) | ||
* @see java.util.Iterator#remove() | ||
*/ | ||
public void remove() { | ||
// not supported | ||
throw new UnsupportedOperationException(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,190 @@ | ||
package erjang; | ||
|
||
import java.util.Iterator; | ||
import java.util.NoSuchElementException; | ||
|
||
import junit.framework.TestCase; | ||
|
||
public class EObjectIteratorTest extends TestCase { | ||
public void testNil() throws Exception { | ||
Iterator<EObject> it = new EObjectIterator(ERT.NIL); | ||
assertNotNull(it); | ||
assertFalse(it.hasNext()); | ||
} | ||
|
||
public void testNull() throws Exception { | ||
Iterator<EObject> it = new EObjectIterator(null); | ||
assertNotNull(it); | ||
assertFalse(it.hasNext()); | ||
} | ||
|
||
public void testEString() throws Exception { | ||
EString message = EString.fromString("Hello, World!"); | ||
Iterator<EObject> it = new EObjectIterator(message); | ||
assertNotNull(it); | ||
assertTrue(it.hasNext()); | ||
EObject o = it.next(); | ||
assertNotNull(o); | ||
assertEquals(message, o); | ||
assertFalse(it.hasNext()); | ||
try { | ||
it.next(); | ||
fail("no more elements, iterator should throw exception"); | ||
} | ||
catch (NoSuchElementException t) { | ||
// expected | ||
} | ||
} | ||
|
||
public void testEInt() throws Exception { | ||
EInteger num = ESmall.make(42); | ||
Iterator<EObject> it = new EObjectIterator(num); | ||
assertNotNull(it); | ||
assertTrue(it.hasNext()); | ||
EObject o = it.next(); | ||
assertNotNull(o); | ||
assertEquals(num, o); | ||
assertFalse(it.hasNext()); | ||
try { | ||
it.next(); | ||
fail("no more elements, iterator should throw exception"); | ||
} | ||
catch (NoSuchElementException t) { | ||
// expected | ||
} | ||
} | ||
|
||
public void testSeqWithSingleNil() throws Exception { | ||
ESeq seq = ESeq.fromArray(new EObject[] { | ||
ERT.NIL | ||
}); | ||
assertEquals(1, seq.length()); | ||
Iterator<EObject> it = seq.iterator(); | ||
assertNotNull(it); | ||
assertTrue(it.hasNext()); | ||
EObject o = it.next(); | ||
assertNotNull(o); | ||
assertTrue(o.isNil()); | ||
assertEquals(ERT.NIL, o); | ||
assertFalse(it.hasNext()); | ||
try { | ||
it.next(); | ||
fail("no more elements, iterator should throw exception"); | ||
} | ||
catch (NoSuchElementException t) { | ||
// expected | ||
} | ||
} | ||
|
||
public void testSeqWithTwoNils() throws Exception { | ||
ESeq seq = ESeq.fromArray(new EObject[] { | ||
ERT.NIL, | ||
ERT.NIL | ||
}); | ||
assertEquals(2, seq.length()); | ||
Iterator<EObject> it = seq.iterator(); | ||
assertNotNull(it); | ||
assertTrue(it.hasNext()); | ||
EObject o = it.next(); | ||
assertNotNull(o); | ||
assertTrue(o.isNil()); | ||
assertEquals(ERT.NIL, o); | ||
assertTrue(it.hasNext()); | ||
o = it.next(); | ||
assertNotNull(o); | ||
assertTrue(o.isNil()); | ||
assertEquals(ERT.NIL, o); | ||
assertFalse(it.hasNext()); | ||
try { | ||
it.next(); | ||
fail("no more elements, iterator should throw exception"); | ||
} | ||
catch (NoSuchElementException t) { | ||
// expected | ||
} | ||
} | ||
|
||
public void testSeqWithSingleObject() throws Exception { | ||
EObject first = EString.fromString("Hello"); | ||
ESeq seq = ESeq.fromArray(new EObject[] { | ||
first | ||
}); | ||
assertEquals(1, seq.length()); | ||
Iterator<EObject> it = seq.iterator(); | ||
assertNotNull(it); | ||
assertTrue(it.hasNext()); | ||
EObject o = it.next(); | ||
assertNotNull(o); | ||
assertEquals(first, o); | ||
assertFalse(it.hasNext()); | ||
try { | ||
it.next(); | ||
fail("no more elements, iterator should throw exception"); | ||
} | ||
catch (NoSuchElementException t) { | ||
// expected | ||
} | ||
} | ||
|
||
public void testSeqWithTwoObjects() throws Exception { | ||
EObject first = EString.fromString("Hello"); | ||
EObject second = EString.fromString("World"); | ||
ESeq seq = ESeq.fromArray(new EObject[] { | ||
first, | ||
second | ||
}); | ||
assertEquals(2, seq.length()); | ||
Iterator<EObject> it = seq.iterator(); | ||
assertNotNull(it); | ||
assertTrue(it.hasNext()); | ||
EObject o = it.next(); | ||
assertNotNull(o); | ||
assertEquals(first, o); | ||
assertTrue(it.hasNext()); | ||
o = it.next(); | ||
assertNotNull(o); | ||
assertEquals(second, o); | ||
assertFalse(it.hasNext()); | ||
try { | ||
it.next(); | ||
fail("no more elements, iterator should throw exception"); | ||
} | ||
catch (NoSuchElementException t) { | ||
// expected | ||
} | ||
} | ||
|
||
public void testSeqWithThreeObjects() throws Exception { | ||
EObject first = EString.fromString("Hello"); | ||
EObject second = EString.fromString("World"); | ||
EObject third = ESmall.make(42); | ||
ESeq seq = ESeq.fromArray(new EObject[] { | ||
first, | ||
second, | ||
third | ||
}); | ||
assertEquals(3, seq.length()); | ||
Iterator<EObject> it = seq.iterator(); | ||
assertNotNull(it); | ||
assertTrue(it.hasNext()); | ||
EObject o = it.next(); | ||
assertNotNull(o); | ||
assertEquals(first, o); | ||
assertTrue(it.hasNext()); | ||
o = it.next(); | ||
assertNotNull(o); | ||
assertEquals(second, o); | ||
assertTrue(it.hasNext()); | ||
o = it.next(); | ||
assertNotNull(o); | ||
assertEquals(third, o); | ||
assertFalse(it.hasNext()); | ||
try { | ||
it.next(); | ||
fail("no more elements, iterator should throw exception"); | ||
} | ||
catch (NoSuchElementException t) { | ||
// expected | ||
} | ||
} | ||
} |