Skip to content

Commit

Permalink
added EObjectIterator and made ECons Iterable
Browse files Browse the repository at this point in the history
  • Loading branch information
jetztgradnet committed Apr 12, 2012
1 parent 5b64643 commit f437f8f
Show file tree
Hide file tree
Showing 3 changed files with 254 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/main/java/erjang/ECons.java
Expand Up @@ -21,14 +21,15 @@
import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import erjang.m.ets.EMatchContext;
import erjang.m.ets.EPattern;
import erjang.m.ets.ETermPattern;

public abstract class ECons extends EObject {
public abstract class ECons extends EObject implements Iterable<EObject> {

@Override
int cmp_order() {
Expand Down Expand Up @@ -241,4 +242,8 @@ public void collectCharList(CharCollector out)
} else tail.collectCharList(out);
}

@Override
public Iterator<EObject> iterator() {
return new EObjectIterator(this);
}
}
58 changes: 58 additions & 0 deletions src/main/java/erjang/EObjectIterator.java
@@ -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();
}
}
190 changes: 190 additions & 0 deletions src/test/java/erjang/EObjectIteratorTest.java
@@ -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
}
}
}

0 comments on commit f437f8f

Please sign in to comment.