blob: 1b8ecb75fd6e86174adaf4764903e67f48e9c267 [file] [log] [blame]
package groovy
// TODO: split a couple of Set tests into their own class?
class ListTest extends GroovyTestCase {
void testList() {
def x = [10, 11]
assert x.size() == 2
x.add("cheese")
assert x.size() == 3
assert x.contains(10)
assert x.contains(11)
assert x.contains("cheese")
assert x.get(0) == 10
assert x.get(1) == 11
assert x.get(2) == "cheese"
// subscript operator
assert x[0] == 10
assert x[1] == 11
assert x[2] == "cheese"
x[3] = 12
assert x[3] == 12
if ( x.contains("cheese") ) {
// ignore
} else {
assert false , "x should contain cheese!"
}
if ( x.contains(10) ) {
// ignore
} else {
assert false , "x should contain 1!"
}
}
void testEmptyList() {
def x = []
assert x.size() == 0
x.add("cheese")
assert x.get(0) == "cheese"
assert x.size() == 1
assert x[0] == "cheese"
}
void testSubscript() {
def x = []
x[1] = 'cheese'
assert x[0] == null
assert x[1] == 'cheese'
x[2] = 'gromit'
x[3] = 'wallace'
assert x.size() == 4
x[-1] = 'nice'
assert x[3] == 'nice'
x[-2] = 'cheese'
assert x[2] == 'cheese'
}
void testClosure() {
def l = [1, 2, 3, "abc"]
def block = {i -> println(i) }
l.each(block)
l.each {i-> println(i) }
}
void testMax() {
def l = [1, 2, 5, 3, 7, 1]
assert l.max() == 7
l = [7, 2, 3]
assert l.max() == 7
l = [1, 2, 7]
assert l.max() == 7
// GROOVY-1006
l = [1, 3.2, 4L, (short)7]
assert l.max() == (short)7
}
void testMin() {
def l = [6, 4, 5, 1, 7, 2]
assert l.min() == 1
l = [7, 1, 3]
assert l.min() == 1
l = [1, 2, 7]
assert l.min() == 1
// GROOVY-1006
l = [(long)1, 3.2, 4L, (short)7]
assert l.min() == (long)1
}
void testPlus() {
def l1 = [6, 4, 5, 1, 7, 2]
def l2 = [6, 4, 5, 1, 7, [4,5]]
def l3 = l1 + l2
assert l3 == [6, 4, 5, 1, 7, 2, 6, 4, 5, 1, 7, [4,5]]
l1 = [1, 5.2, 9]
l2 = [3, 4L]
l3 = [1, 5.2, 9, 3, 4L]
assert l1 + l2 == l3
}
void testSetPlus() {
Set s1 = [6, 4, 5, 1, 7, 2]
def s2 = [6, 4, 5, 1, 7, [4,5]]
def s3 = s1 + s2
assert s3 == [1, 2, 4, 5, 6, 7, [4,5]] as Set
}
void testPlusOneElement() {
def l1 = [6, 4, 5, 1, 7, 2]
def l2 = "erererer"
assert l1 + l2 == [6, 4, 5, 1, 7, 2, "erererer"]
}
void testListAppend() {
def list = [1, 2]
list << 3 << 4 << 5
assert list == [1, 2, 3, 4, 5]
def x = [] << 'a' << 'hello' << [2, 3] << 5
assert x == ['a', 'hello', [2, 3], 5]
}
void testTimes() {
def l = [4,7,8]
assert l * 3 == [4, 7, 8, 4, 7, 8, 4, 7, 8]
}
// GROOVY-1006
void testMinus() {
def l1 = [1, 1, 2, 2, 3, 3, 3, 4, 5, 3, 5]
def l2 = [1, 2.0, 4L]
assert l1 - l2 == [3, 3, 3, 5, 3, 5]
}
void testSetSimpleMinus() {
Set s1 = [1, 1, 2, 2, 3, 3, 3, 4, 5, 3, 5]
def s2 = s1 - [1, 4]
assert s2 == [2, 3, 5] as Set
def s3 = s1 - 4.0
assert s3 == [1, 2, 3, 5] as Set
}
// GROOVY-1006
void testMinusDifferentTypes() {
def l1 = [1, 1, "wrer", 2, 3, 3, "wrewer", 4, 5, "w", "w"]
def l2 = [1, 2, "w"]
assert l1 - l2 == ["wrer", 3, 3, "wrewer", 4, 5]
}
void testMinusEmptyCollection(){
// GROOVY-790
def list = [1,1]
assert list - [] == list
// GROOVY-1006
list = [1,2,2,3,1]
assert list - [] == list
}
void testIntersect() {
def l1 = [1, 1, "wrer", 2, 3, 3, "wrewer", 4, 5, "w", "w"]
def l2 = [1, 2, "f", "w"]
assert l1.intersect(l2) == [1, 2, "w"]
// GROOVY-1006
l1 = [1, 1.0, "wrer", 2, 3, 3L, "wrewer", 4, 5, "w", "w"]
l2 = [(double)1, 2L, "f", "w"]
assert l1.intersect(l2) == [1, 2, "w"]
}
// GROOVY-1006
void testListEqual() {
assert [1, 2.0, 3L, (short)4] == [1, 2, 3, 4]
}
// GROOVY-1006
void testSortNumbersMixedType() {
assert [1, (short)3, 4L, 2.9, (float)5.2].sort() == [1, 2.9, (short)3, 4L, (float)5.2]
}
// GROOVY-1006
void testUnique() {
def a = [1, 4L, 1.0]
def b = a.unique()
assert (b == a && a == [1, 4])
a =[1, "foo", (short)3, 4L, 1.0, (float)3.0]
b = a.unique()
assert (b == a && a == [1, "foo", (short)3, 4L])
}
void testListFlatten() {
def l = [[[4, 5, 6, [46, 7, "erer"]], 4, [3, 6, 78]], 4]
assert l.flatten() == [4, 5, 6, 46, 7, "erer", 4, 3, 6, 78, 4]
}
void testSetFlatten() {
Set l = [[[4, 5, 6, [46, 7, "erer"] as Set] as Set, 4, [3, 6, 78] as Set] as Set, 4]
assert l.flatten() == [3, 4, 5, 6, 7, 46, 78, "erer"] as Set
}
void testFlattenWithRanges() {
def flat = [1, 3, 20..24, 33].flatten()
assert flat == [1, 3, 20, 21, 22, 23, 24, 33]
}
void testListsAndRangesCompare() {
def l = [1, 2, 3]
def r = 1..3
assert r == l
assert l == r
}
void testRemove() {
def l = ['a', 'b', 'c']
l.remove(1)
assert l == ['a', 'c']
l.remove(0)
assert l == ['c']
assert l.size() == 1
}
void testPop() {
def l = []
l << 'a' << 'b'
def value = l.pop()
assert value == 'b'
assert l == ['a']
l.add('c')
value = l.pop()
assert value == 'c'
value = l.pop()
assert value == 'a'
try {
value = l.pop()
fail("Should have thrown an exception")
}
catch (NoSuchElementException e) {
println "Worked: caught expected exception: ${e}"
}
}
void testBoolCoerce() {
// Explicit coercion
assertFalse((Boolean) [])
assertTrue((Boolean) [1])
// Implicit coercion in statements
List list = null
if (list) {
fail("null should have evaluated to false, but didn't")
}
list = []
if (list) {
fail("[] should have evaluated to false, but didn't")
}
list = [1]
if (list) {
// OK
} else {
fail("[] should have evaluated to false, but didn't")
}
}
// see also SubscriptTest
void testGetAtRange(){
def list = [0,1,2,3]
assert list[0..3] == list , 'full list'
assert list[0..0] == [0] , 'one element range'
assert list[0..<0] == [] , 'empty range'
assert list[3..0] == [3,2,1,0] , 'reverse range'
assert list[3..<0] == [3,2,1] , 'reverse exclusive range'
assert list[-2..-1] == [2,3] , 'negative index range'
assert list[-2..<-1] == [2] , 'negative index range exclusive'
assert list[-1..-2] == [3,2] , 'negative index range reversed'
assert list[-1..<-2] == [3] , 'negative index range reversed exclusive' // aaaahhhhh !
assert list[0..-1] == list , 'pos - neg value'
assert list[0..<-1] == [0] , 'pos - neg value exclusive -> empty'
assert list[0..<-2] == list , 'pos - neg value exclusive -> full'
// TODO reinstate this test
//shouldFail (NullPointerException.class) { list[null] }
shouldFail (IndexOutOfBoundsException.class) { list[5..6] }
}
void testPutAtSplice(){
// usual assignments
def list = [0,1,2,3]
list[1,2] = [11,12]
assert list == [0, 11, 12, 3 ] , 'same length assignment'
list = [0,1,2,3]
list[1,1] = [11]
assert list == [0, 11, 2, 3 ] , 'length 1 assignment'
list = [0,1,2,3]
list[1,0] = [ ]
assert list == [0, 1, 2, 3 ] , 'length 0 assignment, empty splice'
// assignments at bounds
list = [0,1,2,3]
list[0,0] = [10]
assert list == [10, 1, 2, 3 ] , 'left border assignment'
list = [0,1,2,3]
list[3,3] = [13]
assert list == [0, 1, 2, 13 ] , 'right border assignment'
// assignments outside current bounds
list = [0,1,2,3]
list[-1,-1] = [-1]
assert list == [0, 1, 2, -1] , 'left of left border'
list = [0,1,2,3]
shouldFail (IndexOutOfBoundsException.class) {
list[3,4] = [3,4]
assert list == [0, 1, 2, 3, 4]
}
// structural changes
list = [0,1,2,3]
list[1,2] = ['x']
assert list == [0, 'x', 3] , 'compacting'
list = [0,1,2,3]
list[1,2] = ['x','x','x']
assert list == [0, 'x','x','x', 3] , 'extending'
}
void testPutAtRange(){
// usual assignments
def list = [0,1,2,3]
list[1..2] = [11,12]
assert list == [0, 11, 12, 3 ] , 'same length assignment'
list = [0,1,2,3]
list[1..1] = [11]
assert list == [0, 11, 2, 3 ] , 'length 1 assignment'
list = [0,1,2,3]
list[0..<0] = []
assert list == [0, 1, 2, 3 ] , 'length 0 assignment, empty splice'
// assignments at bounds
list = [0,1,2,3]
list[0..0] = [10]
assert list == [10, 1, 2, 3 ] , 'left border assignment'
list = [0,1,2,3]
list[3..3] = [13]
assert list == [0, 1, 2, 13 ] , 'right border assignment'
// assignments outside current bounds
list = [0,1,2,3]
list[-1..-1] = [-1]
assert list == [0, 1, 2, -1] , 'left of left border'
list = [0,1,2,3]
list[3..4] = [3,4]
assert list == [0, 1, 2, 3, 4]
// structural changes
list = [0,1,2,3]
list[1..2] = ['x']
assert list == [0, 'x', 3] , 'compacting'
list = [0,1,2,3]
list[1..2] = ['x','x','x']
assert list == [0, 'x','x','x', 3] , 'extending'
}
void testCrazyPutAtRange(){
def list = []
list[0..<0] = [0,1,2,3]
assert list == [0, 1, 2, 3 ] , 'fill by empty Range'
list = [0,1,2,3]
list[3..0] = []
assert list == [] , 'delete by reverse Range'
list = [0,1,2,3]
list[-4..-1] = []
assert list == [] , 'delete by negativ Range'
list = [0,1,2,3]
list[0..-1] = []
assert list == [] , 'delete by pos-negativ Range'
}
// GROOVY-1128
void testAsSynchronized() {
def synclist = [].asSynchronized() << 1
assert synclist == [1]
}
// GROOVY-1128
void testAsImmutable() {
def immlist = [1,2,3].asImmutable()
assert immlist == [1,2,3]
def testlist = ['a','b','c','d','e']
assert testlist[immlist] == ['b','c','d']
assert immlist[0] == 1
assert immlist[0..-1] == immlist
shouldFail(UnsupportedOperationException.class){
immlist << 1
}
shouldFail(UnsupportedOperationException.class){
immlist[0..<0] = [0]
}
shouldFail(UnsupportedOperationException.class){
immlist[0] = 1
}
}
}