package ch.akuhn.util; import static ch.akuhn.util.ListTest.Elem.a; import static ch.akuhn.util.ListTest.Elem.b; import static ch.akuhn.util.ListTest.Elem.c; import static ch.akuhn.util.ListTest.Elem.d; import static ch.akuhn.util.ListTest.Elem.e; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import java.util.Iterator; import org.junit.Test; import org.junit.runner.RunWith; import ch.unibe.jexample.Given; import ch.unibe.jexample.JExample; @RunWith(JExample.class) @SuppressWarnings("unchecked") public class ListTest { public enum Elem { a, b, c, d, e }; @Given("nil") @Test(expected = UnsupportedOperationException.class) public void cannotSetTailOfEmpty(List nil) { nil.setTail(List.nil()); } @Test public List fill0Elem() { Object a = new Object(); List nil = List.fill(0, a); assertEquals(0, nil.size()); assertEquals(true, nil.isEmpty()); assertEquals(false, nil.iterator().hasNext()); return nil; } @Test public List fill1Elem() { Object a = new Object(); List $ = List.fill(1, a); assertEquals(1, $.size()); assertEquals(false, $.isEmpty()); Iterator it = $.iterator(); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(false, it.hasNext()); return $; } @Test public List fill5Elem() { List $ = List.fill(5, a); assertEquals(5, $.size()); assertEquals(false, $.isEmpty()); Iterator it = $.iterator(); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(false, it.hasNext()); return $; } @Test public List from0ElemArray() { List nil = List.from(new Object[] {}); assertEquals(0, nil.size()); assertEquals(true, nil.isEmpty()); assertEquals(false, nil.iterator().hasNext()); return nil; } @Test public List from1ElemArray() { List $ = List.from(new Object[] { a }); assertEquals(1, $.size()); assertEquals(false, $.isEmpty()); Iterator it = $.iterator(); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(false, it.hasNext()); return $; } @Test public List from5ElemArray() { List $ = List.from(new Object[] { a, b, c, d, e }); assertEquals(5, $.size()); assertEquals(false, $.isEmpty()); Iterator it = $.iterator(); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(true, it.hasNext()); assertSame(b, it.next()); assertEquals(true, it.hasNext()); assertSame(c, it.next()); assertEquals(true, it.hasNext()); assertSame(d, it.next()); assertEquals(true, it.hasNext()); assertSame(e, it.next()); assertEquals(false, it.hasNext()); return $; } @Test @Given("new5tuple") public void get(List $) { assertSame(a, $.get(0)); assertSame(b, $.get(1)); assertSame(c, $.get(2)); assertSame(d, $.get(3)); assertSame(e, $.get(4)); } @Given("new5tuple") @Test(expected = IndexOutOfBoundsException.class) public void getMinusOneIsFail(List $) { assertSame(a, $.get(-1)); } @Given("new5tuple") @Test(expected = IndexOutOfBoundsException.class) public void getSizeIsFail(List $) { assertSame(a, $.get(5)); } @Test public List new1tuple() { List $ = List.of(a); assertEquals(1, $.size()); assertEquals(false, $.isEmpty()); Iterator it = $.iterator(); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(false, it.hasNext()); return $; } @Test public List new2tuple() { List $ = List.of(a, b); assertEquals(2, $.size()); assertEquals(false, $.isEmpty()); Iterator it = $.iterator(); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(true, it.hasNext()); assertSame(b, it.next()); assertEquals(false, it.hasNext()); return $; } @Test public List new3tuple() { List $ = List.of(a, b, c); assertEquals(3, $.size()); assertEquals(false, $.isEmpty()); Iterator it = $.iterator(); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(true, it.hasNext()); assertSame(b, it.next()); assertEquals(true, it.hasNext()); assertSame(c, it.next()); assertEquals(false, it.hasNext()); return $; } @Test public List new4tuple() { List $ = List.of(a, b, c, d); assertEquals(4, $.size()); assertEquals(false, $.isEmpty()); Iterator it = $.iterator(); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(true, it.hasNext()); assertSame(b, it.next()); assertEquals(true, it.hasNext()); assertSame(c, it.next()); assertEquals(true, it.hasNext()); assertSame(d, it.next()); assertEquals(false, it.hasNext()); return $; } @Test public List new5tuple() { List $ = List.of(a, b, c, d, e); assertEquals(5, $.size()); assertEquals(false, $.isEmpty()); Iterator it = $.iterator(); assertEquals(true, it.hasNext()); assertSame(a, it.next()); assertEquals(true, it.hasNext()); assertSame(b, it.next()); assertEquals(true, it.hasNext()); assertSame(c, it.next()); assertEquals(true, it.hasNext()); assertSame(d, it.next()); assertEquals(true, it.hasNext()); assertSame(e, it.next()); assertEquals(false, it.hasNext()); return $; } @Test public List nil() { List nil = List.nil(); assertEquals(0, nil.size()); assertEquals(true, nil.isEmpty()); assertEquals(false, nil.iterator().hasNext()); return nil; } @Test @Given("new3tuple") public void testAppend(List $3) { List $ = $3.append(e); assertNotSame($3, $); assertEquals(4, $.size()); assertEquals(false, $.isEmpty()); assertEquals(a, $.get(0)); assertEquals(b, $.get(1)); assertEquals(c, $.get(2)); assertEquals(e, $.get(3)); } @Test @Given("new3tuple") public void testAppendList(List $3) { List $2 = List.of(d, e); List $ = $3.appendList($2); assertNotSame($2, $); assertNotSame($3, $); assertEquals(5, $.size()); assertEquals(false, $.isEmpty()); assertEquals(a, $.get(0)); assertEquals(b, $.get(1)); assertEquals(c, $.get(2)); assertEquals(d, $.get(3)); assertEquals(e, $.get(4)); } @Test @Given("new3tuple") public void testPrepend(List $3) { List $ = $3.prepend(e); assertNotSame($3, $); assertEquals(4, $.size()); assertEquals(false, $.isEmpty()); assertEquals(e, $.get(0)); assertEquals(a, $.get(1)); assertEquals(b, $.get(2)); assertEquals(c, $.get(3)); } @Test @Given("new3tuple") public void testPrependList(List $3) { List $2 = List.of(d, e); List $ = $3.prependList($2); assertNotSame($2, $); assertNotSame($3, $); assertEquals(5, $.size()); assertEquals(false, $.isEmpty()); assertEquals(d, $.get(0)); assertEquals(e, $.get(1)); assertEquals(a, $.get(2)); assertEquals(b, $.get(3)); assertEquals(c, $.get(4)); } @Test @Given("new5tuple") public void testSublist(List $5) { java.util.List sub = $5.subList(1, 4); assertEquals(3, sub.size()); assertEquals(b, sub.get(0)); assertEquals(c, sub.get(1)); assertEquals(d, sub.get(2)); } @Test @Given("new5tuple") public void testSublistEmpty(List $5) { java.util.List sub = $5.subList(2, 2); assertEquals(0, sub.size()); } @Given("new5tuple") @Test(expected = IllegalArgumentException.class) public void testSublistNegative(List $5) { @SuppressWarnings("unused") java.util.List sub = $5.subList(4, 1); } @Test @Given("new3tuple") public void testToArray(List $3) { Object[] $ = new Object[3]; Object[] prev = $; $ = $3.toArray($); assertSame($, prev); assertEquals(3, $.length); assertEquals(a, $[0]); assertEquals(b, $[1]); assertEquals(c, $[2]); } @Test @Given("new3tuple") public void testToLongArrayIsLong(List $3) { Object[] $ = new Object[4]; Object[] prev = $; $ = $3.toArray($); assertSame($, prev); // !!! assertEquals(4, $.length); assertEquals(a, $[0]); assertEquals(b, $[1]); assertEquals(c, $[2]); assertEquals(null, $[3]); } @Test @Given("new3tuple") public void testToShortArray(List $3) { Object[] $ = new Object[2]; Object[] prev = $; $ = $3.toArray($); assertNotSame($, prev); // !!! assertEquals(3, $.length); assertEquals(a, $[0]); assertEquals(b, $[1]); assertEquals(c, $[2]); } }