/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */
package groovy

import groovy.test.GroovyTestCase

import java.awt.Dimension
import java.nio.CharBuffer
import java.util.concurrent.LinkedBlockingQueue
import org.codehaus.groovy.util.StringUtil

/** 
 * Tests various GDK methods
 */
class GroovyMethodsTest extends GroovyTestCase {
    
    void testAbs() {
        def absoluteNumberOne = 1
        def negativeDouble = -1d
        def negativeFloat = -1f
        def negativeLong = -1l
        
        assert absoluteNumberOne == negativeDouble.abs()   
        assert absoluteNumberOne == negativeFloat.abs()   
        assert absoluteNumberOne == negativeLong.abs()   
    }
    
    void testCollect() {
        assert [2, 4, 6].collect {it * 2} == [4, 8, 12]
        def answer = [2, 4, 6].collect(new Vector()) {it * 2}
        assert answer[0] == 4
        assert answer[1] == 8
        assert answer[2] == 12
        assert [1: 'a', 2: 'b', 3: 'c'].collect {k, v -> k + v} == ['1a', '2b', '3c']
        assert [1: 'a', 2: 'b', 3: 'c'].collect {it.getKey() + "*" + it.getValue()} == ['1*a', '2*b', '3*c']
    }

    void testGStringIsCase() {
        def one = 'one'
        def two = 'two'
        assert 'onetwo'.isCase('onetwo')
        assert 'onetwo'.isCase("one$two")
        assert 'onetwo'.isCase("$one$two")
        assert "one$two".isCase('onetwo')
        assert "$one$two".isCase('onetwo')
        assert "one${two}".isCase("${one}two")
    }

    void testSpreadDot() {
        def animals = ['cat', 'dog']
        assert animals*.size() == [3, 3]
        animals = [1:'cat', 2:'dog']
        assert animals.values()*.size() == [3, 3]
        animals = ['cat', 'dog'] as Vector
        assert animals.elements()*.size() == [3, 3]
    }

    void testCollectNested() {
        def animalLists= [["ant", "mouse", "elephant"], ["deer", "monkey"]]
        assert animalLists*.size() == [3, 2]
        assert animalLists.collect{ it.size() } == [3, 2]
        assert animalLists.collectNested{ it.size() } == [[3, 5, 8], [4, 6]]
    }

    void testAsCoercion() {
        if (HeadlessTestSupport.headless) return

        def d0 = new Dimension(100, 200)
        assert d0 == new Dimension(width: 100, height: 200)
        assert d0 == [100, 200] as Dimension
        assert d0 == [width: 100, height: 200] as Dimension
    }

    void testAsCoercionPropogatesCauseMessage() {
        try {
            ['one hundred', 200] as Dimension
        } catch (Exception e) {
            assert e.message.contains("Could not find matching constructor for:")
            assert e.message.contains("String,")
        }
    }

    void testAsCoercionInterface() {
        def letters = ['a', 'b', 'c']
        def ol = new ObserverLike()
        def o = new Observable() {
            @Override
            synchronized void setChanged() {
                super.setChanged()
            }
        }
        o.addObserver(ol as Observer) // addObserver takes Observer as param
        letters.each{ o.setChanged(); o.notifyObservers(it) }
        assert ol.observed == letters
    }

    private class ObserverLike {
      def observed = []
      void update(Observable o, arg) {observed << arg }
    }

    void testCombinations() {
        def lists = [['a', 'b'], [1, 2, 3]]
        def sets = [['a', 'b'] as Set, [1, 2, 3] as Set]
        def expected = [['a', 1], ['a', 2], ['a', 3],
                        ['b', 1], ['b', 2], ['b', 3]] as Set

        assert lists.combinations() as Set == expected
        assert sets.combinations() as Set == expected
        lists = [['a', 'b'], 3]
        assert lists.combinations() as Set == [['a', 3], ['b', 3]] as Set
    }

    void testCombinationsWithAction() {
        def lists = [[2, 3],[4, 5, 6]]
        def expected = [8, 12, 10, 15, 12, 18]
        assert lists.combinations {x,y -> x*y } as Set == expected as Set
    }

    void testEachCombination() {
        def lists = [[2, 3],[4, 5, 6]]
        Set expected = [8, 12, 10, 15, 12, 18]
        Set collector = []
        lists.eachCombination {x,y -> collector << x*y }
        assert collector == expected
    }

    void testTranspose() {
        def list1 = [['a', 'b'], [1, 2, 3]]
        def list2 = [['a', 'b', 'c'], [1, 2]]
        def expected = [['a', 1], ['b', 2]]
        assert list1.transpose() == expected
        assert list2.transpose() == expected
    }

    void testSum() {
        assert [].sum() == null
        assert [null].sum() == null
        assert [1].sum() == 1
        assert [1, 2, 3].sum() == 6
        def nums = [1, 2, 3, 4] as Integer[]
        assert nums.sum() == 10
        assert nums.sum(5) == 15
        assert [1, 2, 3].sum("") == "123"
        assert [[1, 2], [3, 4], [5, 6]].sum() == [1, 2, 3, 4, 5, 6]
        assert [[1, 2], [3, 4], [5, 6]].sum("") == "[1, 2][3, 4][5, 6]"

        assert [].sum {it.length()} == null
        assert [null].sum {it.toString()} == 'null'
        assert ["abc"].sum {it.length()} == 3
        assert ["a", "bc", "def"].sum {it.length()} == 6
        assert ["a", "bc", "def"].sum("") {it.length()} == "123"
        assert [[1, 2], [3, 4], [5, 6]].sum {it.size()} == 6
        assert [[1, 2], [3, 4], [5, 6]].sum {list -> list.collect {it * 2}} == [2, 4, 6, 8, 10, 12]
        def result = []
        [[1, 2], [3, 4], [5, 6]].each {list -> result << list.collect {it * 2}}
        assert result.sum() == [2, 4, 6, 8, 10, 12]
        assert [[1, 2], [3, 4], [5, 6]].sum {list -> list.collect {it * 2}} == [2, 4, 6, 8, 10, 12]
    }

    void testSumForIteratorWithList() {
        def result = [1, 2, 3].iterator().sum([])
        assert result == [1, 2, 3]
    }

    void testEachLineString() {
        def twolines = 'one\ntwo'
        def result = ''
        twolines.eachLine{ line, count -> result += "$count: $line\n" }
        assert result == '0: one\n1: two\n'
    }

    void testEachLineStringWithStartingLine() {
        def twolines = 'one\ntwo'
        def result = ''
        twolines.eachLine(1){ line, count -> result += "$count: $line\n" }
        assert result == '1: one\n2: two\n'
    }

    void testSumForIteratorWithInt() {
        def result = [1, 2, 3].iterator().sum(0)
        assert result == 6
    }

    void testReverseForIterator() {
        def listIterator = [1, 2, 3].iterator()
        def result = []
        def revIterator = listIterator.reverse()
        assert revIterator instanceof Iterator
        revIterator.each{
            result << it
        }
        assert result == [3, 2, 1]
    }

    void testReverseForObjectArrays() {
        Object[] numbers = [1, 2, 3]
        def result = numbers.reverse()
        assert result == [3, 2, 1]
    }

    void testJoin() {
        assert [2, 4, 6].join("-") == "2-4-6"
        assert ["edam", "cheddar", "brie"].join(", ") == 'edam, cheddar, brie'
        assert ["abc", 5, 2.34].join(", ") == "abc, 5, 2.34"
    }

    void testTimes() {
        def count = 0
        5.times {i -> count = count + i}
        assert count == 10
        count = 0
        def temp = 5
        temp.times {i -> count = count + i}
        assert count == 10
    }

    void testArraySubscript() {
        def list = [1, 2, 3, 4]
        def array = list.toArray()
        def value = array[2]
        assert value == 3
        array[0] = 9
        assert array[0] == 9
        assert array[0..<0] == []
    }

    void testToCharacterMethod() {
        def s = 'c'
        def x = s.toCharacter()
        assert x instanceof Character
    }

    void testGetCharsMethod() {
        def s = 'abc'
        def x = s.chars
        assert x instanceof char[]
        assert x.size() == 3
    }

    void testCharacterToMethods() {
        char c1 = 'a'
        char c2 = 'Z'
        assert c1.toUpperCase() == 'A'
        assert c2.toLowerCase() == 'z'
    }

    void testCharacterIsMethods() {
        def f = false
        def t = true
        checkProperties('a', f, t, f, f, t, t)
        checkProperties('Z', t, f, f, f, t, t)
        checkProperties('5', f, f, f, t, f, t)
        checkProperties(' ', f, f, t, f, f, f)
        checkProperties('&', f, f, f, f, f, f)
    }

    private def checkProperties(String s, boolean isUpperCase, boolean isLowerCase, boolean isWhitespace,
                            boolean isDigit, boolean isLetter, boolean isLetterOrDigit) {
        char c = s as char
        assert c.isUpperCase() == isUpperCase
        assert c.isLowerCase() == isLowerCase
        assert c.isWhitespace() == isWhitespace
        assert c.isLetter() == isLetter
        assert c.isDigit() == isDigit
        assert c.isLetterOrDigit() == isLetterOrDigit
    }

    void testPutAtRange() {
        def list
        list = ['a', 'b', 'c']; list[4] = 'x'; assert list == ["a", "b", "c", null, "x"]
        list = ['a', 'b', 'c']; list[1..2] = ['x', 'y']; assert list == ["a", "x", "y"]
        list = ['a', 'b', 'c']; list[1..2] = 'x'; assert list == ["a", "x"]
        list = ['a', 'b', 'c']; list[4..5] = ['x', 'y']; assert list == ["a", "b", "c", null, "x", "y"]
        list = ['a', 'b', 'c']; list[4..5] = 'x'; assert list == ["a", "b", "c", null, "x"]
    }

    void testGetAtRange() {
        def list = ['a', 'b', 'c']
        assert list[1..2] == ['b', 'c']
        assert list[0..<0] == []
    }

    void testCharSequenceGetAt() {
        def x = "matrix"
        assert x[0, 5..0] == 'mxirtam'
        assert x[3..0, 0..3] == 'rtammatr'
        assert x[2..-4, 3..-4, 3..-3] == 'trtr'
        assert x[-1..-3, -3..-1] == 'xirrix'
        assert x[0..<0] == ''
    }

    void testListGrep() {
        def list = ["James", "Bob", "Guillaume", "Sam"]
        def answer = list.grep(~".*a.*")
        assert answer == ["James", "Guillaume", "Sam"]
        answer = list.grep(~"B.b")
        assert answer == ["Bob"]
    }

    void testCollectionToList() {
        def c = [1, 2, 3, 4, 5] // but it's a list
        def l = c.toList()
        assert l.containsAll(c)
        assert c.size() == l.size()
    }

    void testIteratorToList() {
        def c = [1, 2, 3, 4, 5]
        def l = c.iterator().toList()
        assert l.containsAll(c)
        assert c.size() == l.size()
    }

    void testIteratorSize() {
        def c = [1, 2, 3, 4, 5]
        def it = c.iterator()
        assert c.size() == it.size()
    }

    void testEnumerationToList() {
        def c = [1, 2, 3, 4, 5]
        def v = new Vector()
        c.each {
            v.add(it)
        }
        def l = v.elements().toList()
        assert l.containsAll(c)
        assert c.size() == l.size()
    }

    void testStringToList() {
        String s = 'hello 10'
        def gs = "hello ${5 + 5}"
        def expected = ["h", "e", "l", "l", "o", " ", "1", "0"]
        assert s.toList() == expected
        assert s as String[] == expected
        assert gs as String[] == expected
    }

    void testCollectionAsList() {
        Integer[] nums = [1, 2, 3, 4, 5]
        def numList = nums as List
        nums.each {assert numList.contains(it)}
        assert nums.size() == numList.size()
    }

    void testCollectionAsLinkedList() {
        Integer[] nums = [1, 2, 3, 4, 5]
        def numList = nums as LinkedList
        nums.each {assert numList.contains(it)}
        assert nums.size() == numList.size()
        assert numList.class == LinkedList.class
    }

    void testArrayListAsLinkedList() {
        ArrayList nums = [1, 2, 3, 4, 5]
        def result = nums as LinkedList
        assert result == [1, 2, 3, 4, 5]
        assert result.class == LinkedList
    }

    void testFileSize() {
        assert new File('gradle.properties').size()
    }

    void testMatcherSize() {
        assertEquals 3, ('aaa' =~ /./).count
        assertEquals 3, ('aaa' =~ /./).size()
        assertEquals 1, ('a' =~ /./).size()
        assertEquals 0, ('a' =~ /x/).size()
    }

    void testJoinString() {
        String[] arr = ["a", "b", "c", "d"]
        def joined = arr.join(", ")
        assert joined == "a, b, c, d"
    }

    void testReverseEachForList() {
        def l = ["cheese", "loves", "Guillaume"]
        def expected = ["Guillaume", "loves", "cheese"]
        def answer = []
        l.reverseEach {answer << it}
        assert answer == expected
    }

    void testReverseEachForArray() {
        String[] items = ["cheese", "loves", "Guillaume"]
        String[] expected = ["Guillaume", "loves", "cheese"]
        def answer = []
        items.reverseEach {answer << it}
        assert answer == expected
        assert items.reverse() == expected
    }

    void testGrep() {
        def list = ["Guillaume", "loves", "cheese"]
        def answer = list.grep(~".*ee.*")
        assert answer == ["cheese"]
        list = [123, "abc", 4.56]
        answer = list.grep(String)
        assert answer == ["abc"]
        list = [4, 2, 7, 3, 6, 2]
        answer = list.grep(2..3)
        assert answer == [2, 3, 2]
    }

    void testMapGetWithDefault() {
        def map = [:]
        assert map.foo == null
        map.get("foo", []).add(123)
        assert map.foo == [123]
        map.get("bar", [:]).get("xyz", [:]).cheese = 123
        assert map.bar.xyz.cheese == 123
        assert map.size() == 2
    }

    void testInForLists() {
        def list = ['a', 'b', 'c']
        assert 'b' in list
        assert !('d' in list)
    }

    void testFirstLastHeadTailInitForLists() {
        def list = ['a', 'b', 'c']
        assert 'a' == list.first()
        assert 'a' == list.head()
        assert 'c' == list.last()
        assert ['b', 'c'] == list.tail()
        assert ['a', 'b'] == list.init()
        assert list.size() == 3

        list = []
        shouldFail(NoSuchElementException) {
            list.first()
        }
        shouldFail(NoSuchElementException) {
            list.head()
        }
        shouldFail(NoSuchElementException) {
            list.last()
        }
        shouldFail(NoSuchElementException) {
            list.tail()
        }
        shouldFail(NoSuchElementException) {
            list.init()
        }
        assert list.size() == 0
    }

    void testFirstLastHeadTailInitForIterables() {
        int a
        Iterable iterable = { [ hasNext:{ a < 6 }, next:{ a++ } ] as Iterator } as Iterable

        a = 1
        assert 1 == iterable.first()
        a = 1
        assert 1 == iterable.head()
        a = 1
        assert 5 == iterable.last()
        a = 1
        assert [2, 3, 4, 5] == iterable.tail()
        a = 1
        assert [1, 2, 3, 4] == iterable.init()

        iterable = { [ hasNext:{ false }, next:{ 1 } ] as Iterator } as Iterable
        shouldFail(NoSuchElementException) {
            iterable.first()
        }
        shouldFail(NoSuchElementException) {
            iterable.head()
        }
        shouldFail(NoSuchElementException) {
            iterable.last()
        }
        shouldFail(NoSuchElementException) {
            iterable.init()
        }
        shouldFail(NoSuchElementException) {
            iterable.tail()
        }
    }

    void testFirstLastHeadTailInitForArrays() {
        String[] ary = ['a', 'b', 'c'] as String[]
        assert 'a' == ary.first()
        assert 'a' == ary.head()
        assert 'c' == ary.last()
        assert ['b', 'c'] == ary.tail()
        assert ['a', 'b'] == ary.init()
        assert ary.length == 3

        ary = [] as String[]
        shouldFail(NoSuchElementException) {
            ary.first()
        }
        shouldFail(NoSuchElementException) {
            ary.head()
        }
        shouldFail(NoSuchElementException) {
            ary.last()
        }
        shouldFail(NoSuchElementException) {
            ary.tail()
        }
        shouldFail(NoSuchElementException) {
            ary.init()
        }
        assert ary.length == 0
    }

    void testPushPopForLists() {
        def list = ['a', 'b', 'c']
        assert list.push('d')
        assert list.size() == 4
        assert list.pop() == 'd'
        assert list.size() == 3
    }

    void testInForArrays() {
        String[] array = ['a', 'b', 'c']
        assert 'b' in array
        assert !('d' in array)
    }

    void testMaxForIterable() {
        assert [-5, -3, -1, 0, 2, 4].max {it * it} == -5
        assert ['be', 'happy', null].max{ it == 'be' ? null : "" + it } == null
        assert ['be', 'happy', null].max{ it == 'happy' ? null : "" + it } == null
        assert ['happy', null, 'birthday'].max{ ("" + it).size() } == 'birthday'
        assert ['be', null].max{ ("" + it).size() } == null
        assert [null, 'result'].max{ "" + it } == 'result'
        def nums = [42, 35, 17, 100]
        assert [].max{ it } == null
        assert nums.max{ it } == 100
        assert nums.max{ null } in nums
        assert nums.max{ it.toString().toList()*.toInteger().sum() } == 35
    }

    void testMinForIterable() {
        assert [-5, -3, -1, 0, 2, 4].min {it * it} == 0
        assert ['be', 'happy', null].min{ it == 'happy' ? null : "" + it } == 'happy'
        assert ['happy', null, 'birthday'].min{ ("" + it).size() } == null
        assert [null, 'result'].min{ "" + it } == null
        def nums = [42, 35, 17, 100]
        assert [].min{ it } == null
        assert nums.min{ it } == 17
        assert nums.min{ null } in nums 
        assert nums.min{ it.toString().toList()*.toInteger().sum() } == 100
    }

    void testSort() {
        assert [-5, -3, -1, 0, 2, 4].sort {it * it} == [0, -1, 2, -3, 4, -5]
    }

    void testMaxForIterator() {
        assert [-5, -3, -1, 0, 2, 4].collect { it * it }.iterator().max() == 25
    }

    void testMinForIterator() {
        assert [-5, -3, -1, 0, 2, 4].collect { it * it }.iterator().min() == 0
    }

    void testMinForObjectArray() {
        Integer[] numbers = [-5, -3, -1, 0, 2, 4]
        def result = numbers.min()
        assert result == -5
        result = numbers.min{it * it}
        assert result == 0
    }

    void testMaxForObjectArray() {
        Integer[] numbers = [-5, -3, -1, 0, 2, 4]
        def result = numbers.max()
        assert result == 4
        result = numbers.max{it * it}
        assert result == -5
    }

    void testCountForIterator() {
        assert [1, 2, 3, 2, 1].iterator().count(2) == 2
    }

    void testCountForPrimitiveArray() {
        int[] nums = [1, 2, 3, 2, 1]
        assert nums.count(2) == 2
    }

    void testCountForCollection() {
        def nums = [1, 2, 3, 2, 1]
        assert nums.count(2) == 2
    }

    void testCountForString() {
        def string = 'google'
        assert string.count('g') == 2
    }

    void testCountForStringEdgeCase_GROOVY5858() {
        def blank6 = ' ' * 6
        8.times { assert blank6.count(' ' * it) == 7 - it }
    }

    void testJoinForIterator() {
        assert ['a', 'b', 'c', 'a'].iterator().join('-') == 'a-b-c-a'
    }

    void testSortForIterator() {
        def result = []
        def iterator = [-5, -3, -1, 0, 2, 4].iterator().sort {it * it}
        assert iterator instanceof Iterator
        iterator.each {
            result << it
        }
        assert result == [0, -1, 2, -3, 4, -5]
    }

    void testReplaceAllClosure() {
        assert "1 a 2 b 3 c 4".replaceAll("\\p{Digit}") {it * 2} == "11 a 22 b 33 c 44"
    }

    void testReplaceAllClosurePattern() {
        assert "1 a 2 b 3 c 4".replaceAll(~"\\p{Digit}") {it * 2} == "11 a 22 b 33 c 44"
    }

    void testObjectSleep() {
        long start = System.currentTimeMillis()
        long sleeptime = 200
        sleep sleeptime
        long slept = System.currentTimeMillis() - start
        assert (slept >= sleeptime):   \
               "Should have slept for at least $sleeptime ms (+/- epsilon ms) but slept only $slept ms"
    }

    void testObjectSleepInterrupted() {
        def interruptor = new groovy.TestInterruptor(Thread.currentThread())
        new Thread(interruptor).start()
        long start = System.currentTimeMillis()
        long sleeptime = 200
        sleep sleeptime
        long slept = System.currentTimeMillis() - start
        assert (slept >= sleeptime):   \
               "Should have slept for at least $sleeptime ms (+/- epsilon ms) but slept only $slept ms"
    }

    void testObjectSleepWithOnInterruptHandlerStopSleeping() {
        def log = ''
        def interruptor = new groovy.TestInterruptor(Thread.currentThread())
        new Thread(interruptor).start()
        long start = System.currentTimeMillis()
        long sleeptime = 3000
        sleep(sleeptime) {
            log += it.toString()
            true
        }
        long slept = System.currentTimeMillis() - start
        assert slept < sleeptime, "should have been interrupted but slept $slept ms > $sleeptime ms"
        assertEquals 'java.lang.InterruptedException: sleep interrupted', log.toString()
    }

    void testObjectSleepWithOnInterruptHandlerContinueSleeping() {
        def log = ''
        def interruptor = new groovy.TestInterruptor(Thread.currentThread())
        new Thread(interruptor).start()
        long start = System.currentTimeMillis()
        long sleeptime = 3000
        sleep(sleeptime) {
            log += it.toString()
            false // continue sleeping
        }
        long slept = System.currentTimeMillis() - start
        short allowedError = 60 // ms
        assert slept + allowedError >= sleeptime, "should have slept for at least $sleeptime ms but only slept for $slept ms"
        assertEquals 'java.lang.InterruptedException: sleep interrupted', log.toString()
    }

    void testObjectIdentity() {
        def a = new Object()
        def b = a
        assert a.is(b)
        assert !a.is(null)
        assert !1.is(2)
        // naive impl would fall for this trap
        assert !new WackyHashCode().is(new WackyHashCode())
    }

    void testGroupByListIdentity() {
        def items = [1, 2, 'foo']
        assert items.groupBy() == [1:[1], 2:[2], foo:['foo']]
        assert items.groupBy([]) == [1:[1], 2:[2], foo:['foo']]
        assert items.groupBy(Closure.IDENTITY) == [1:[1], 2:[2], foo:['foo']]
        assert items.groupBy({it}) == [1:[1], 2:[2], foo:['foo']]
        assert items.groupBy({it},{it}) == [1:[1:[1]], 2:[2:[2]], foo:[foo:['foo']]]
    }

    void testGroupByList() {
        def expected = [Integer: [1, 2], String: ["a", "b"], BigDecimal: [3.5, 4.6]]
        def list = [1, "a", 2, "b", 3.5, 4.6]
        def result = list.groupBy {it.class}
        assert [1, 2] == result[Integer]
        assert ["a", "b"] == result[String]
        assert [3.5, 4.6] == result[BigDecimal]
        assert 3 == result.size()
    }

    void testGroupByListMultipleCriteria() {
        def list1 = [1, 'a', 2, 'b', 3.5, 4.6]
        def result1 = list1.groupBy({ it.class }, { it.class == Integer ? 'integer' : 'non-integer' })
        assert [integer: [1, 2]] == result1[Integer]
        assert ['non-integer': ['a', 'b']] == result1[String]
        assert ['non-integer': [3.5, 4.6]] == result1[BigDecimal]

        def list2 = [
                [aa: 11, bb: 22, cc: 33],
                [aa: 11, bb: 22, cc: 44],
                [aa: 11, bb: 33, cc: 55],
                [aa: 22, bb: 22, cc: 66],
                [aa: 22, bb: 22, cc: 77],
                [aa: 22, bb: 33, cc: 77]
        ]
        def result2 = list2.groupBy([{ it.aa }, { it.bb }, { it.cc }])
        assert [[aa: 11, bb: 22, cc: 33]]== result2[11][22][33]
        assert [77: [[aa: 22, bb: 33, cc: 77]]] == result2[22][33]
    }

    void testGroupByMapIdentity() {
        def map = [a:1, b:2]
        def entries = map.entrySet()
        def result = map.groupBy()
        def groupedKeys = result.keySet()
        assert entries == groupedKeys
        def entry_a = entries.find{ it.key == 'a' }
        assert result[entry_a] == [a:1]
    }

    void testMapGroupEntriesBy() {
        def expectedKeys = [Integer: [1, 3], String: [2, 4], BigDecimal: [5, 6]]
        def expectedVals = [Integer: [1, 2], String: ["a", "b"], BigDecimal: [3.5, 4.6]]
        def map = [1: 1, 2: "a", 3: 2, 4: "b", 5: 3.5, 6: 4.6]
        def result = map.groupEntriesBy {Map.Entry entry -> entry.value.class}
        assert expectedKeys.Integer == result[Integer].collect {it.key}
        assert expectedVals.Integer == result[Integer].collect {it.value}
        assert expectedKeys.String == result[String].collect {it.key}
        assert expectedVals.String == result[String].collect {it.value}
        assert expectedKeys.BigDecimal == result[BigDecimal].collect {it.key}
        assert expectedVals.BigDecimal == result[BigDecimal].collect {it.value}
        assert 3 == result.size()
    }

    void testMapGroupBy() {
        def map = [1: 1, 2: "a", 3: 2, 4: "b", 5: 3.5, 6: 4.6]
        def result = map.groupBy {entry -> entry.value.class}
        assert 3 == result.size()
        assert result[BigDecimal] == [5:3.5, 6:4.6]
        assert result[String] == [2:'a', 4:'b']
        assert result[Integer] == [1:1, 3:2]
    }

    void testMapGroupByMultipleCriteria() {
        def map1 = [1: 1, 2: "a", 3: 2, 4: "b", 5: 3.5, 6: 4.6]
        def result1 = map1.groupBy({entry -> entry.value.class}, {entry -> entry.key + 1})

        assert 3 == result1.size()
        assert result1[BigDecimal] == [6: [5: 3.5], 7: [6: 4.6]]
        assert result1[String] == [3: [2: "a"], 5: [4: "b"]]
        assert result1[Integer][2] == [1: 1]
        assert result1[Integer][4] == [3: 2]

        def map2 = [aa: 11, bb: 22, cc: 33]
        def result2 = map2.groupBy({ it.key }, { it.key.next() }, { it.key.next().next() })

        assert result2.size() == 3
        assert result2['aa']['ab']['ac'] == [aa: 11]
        assert result2['bb']['bc']['bd'] == [bb: 22]
        assert result2['cc']['cd']['ce'] == [cc: 33]
    }

    void testCountBy() {
        def list = ['a', 'b', 'c', 'a']
        def result = list.countBy { it }

        assert [a: 2, b: 1, c: 1] == result
    }

    def leftCol = ["2"]
    def rightCol = ["1", "2", "3"]

    void testList() {
        def lst = [] as LinkedList
        doIt(lst)
    }

    void testSetWithExplicitCoercion() {
        def set = [] as HashSet
        doIt(set)
    }

    void testSetWithImplicitCoercion() {
        Set set = []
        doIt(set)
    }

    void testVector() {
        def vctr = [] as Vector
        doIt(vctr)
    }

    void doIt(col) {
        col.clear()
        col.addAll(leftCol)
        // not really concerned about correctness, rather that the method can be called, however..
        assert col.intersect(rightCol) as List == ["2"]
    }

    void testFileWithReader() {
        def f = new File('gradle.properties')
        def expected = f.text
        assert expected == f.withReader { r -> r.text }
    }

    void testFileWithInputStream() {
        def f = new File('gradle.properties')
        def buf = new byte[f.size()]
        assert buf.size() == f.withInputStream { i -> i.read(buf) }
    }

    void testUrlReader() {
        def u = new File('gradle.properties').toURL()
        def expected = u.text
        assert expected == u.withReader { r -> r.text }
    }

    void testUrlWithInputStream() {
        def f = new File('gradle.properties')
        def u = f.toURL()
        def buf = new byte[f.size()]
        assert buf.size() == u.withInputStream { i -> i.read(buf) } 
    }

    void testMinus() {
        // collections and lists remove all - deemed most common behavior for these
        assert [1, 2, 1, 3] - 1 == [2, 3]
        // strings remove first - deemed most common behavior for strings
        assert 'abcda.ce' - /a.c/ == 'abcde'
        assert 'abcda.ce' - ~/a.c/ == 'da.ce'
        // should handle nulls too
        assert [null] - [1] == [null]
    }

    void testListSplit() {
        def nums = 1..6
        def (evens, odds) = nums.split{ it % 2 == 0 }
        assert evens == [2, 4, 6]
        assert odds == [1, 3, 5]
        def things = ['3', 'cat', '7', 'dog', '11']
        def (numbers, others) = things.split{ it.isNumber() }
        assert numbers == ['3', '7', '11']
        assert others == ['cat', 'dog']
    }

    void testListDerivativesAreRetainedWithCommonOperators() {
        def x = new WackyList([1, 2, 3])
        assert x.size() == 3
        x += 4
        assert x.sum() == 10
        assert x.size() == 4
        assert x.class == WackyList
        def y = x.findAll{ it % 2 == 1 } as WackyList
        assert y.size() == 2
        assert y.class == WackyList
    }

    void testEachOnEnumClassIteratesThroughTheValuesOfTheEnum() {
        def expected = Suit.values().toList()
        def answer = []
        Suit.each { answer << it }
        assert answer == expected
    }

    void testForLoopWithEnumClassIteratesThroughTheValuesOfTheEnum() {
        def expected = Suit.values().toList()
        def answer = []
        for (s in Suit) {
            answer << s
        }
        assert answer == expected
    }

    void testAsEnumType() {
        assert Suit.HEARTS == ("HEARTS" as Suit)

        shouldFail(IllegalArgumentException) {
            "FOO" as Suit
        }
    }

    void testJavaEnumType() {
        def x = Language.English
        x++
        assert x == Language.French
        x = Language.English
        x--
        assert x == Language.Spanish
        assert Language.French in Language.English..Language.Spanish
    }

    void testStringBuilderPlusPutAtSizeLeftShift() {
        def sb = new StringBuilder('foo')
        assert sb + 'bar' == 'foobar'
        sb << 'baz'
        assert sb.size() == 6
        def result = sb.toString()
        assert result == 'foobaz'
        sb[3..4] = 'abc'
        result = sb.toString()
        assert result == 'fooabcz'
        sb[6..<6] = 'xy'
        result = sb.toString()
        assert result == 'fooabcxyz'
    }

    void testDefiningQueue() {
        def result = [1, 2, 3, 4, 5] as Queue
        assert result instanceof Queue
        assert result.size() == 5
        assert result.sum() == 15
    }

    void testLinkedBlockingQueue() {
        def q = [1, 2, 3, 4, 5, 6, 7, 8, 9] as LinkedBlockingQueue
        assert q.size() == 9
        assert q.class == LinkedBlockingQueue
        q = (q + 10) as LinkedBlockingQueue
        assert q.size() == 10
        assert q.class == LinkedBlockingQueue
        def r = q.findAll{ it % 2 == 0 } as LinkedBlockingQueue
        assert r.size() == 5
        assert r.class == LinkedBlockingQueue
        def s = ((r as LinkedList) - [4, 6]) as LinkedBlockingQueue
        assert s.size() == 3
        assert s.class == LinkedBlockingQueue
        [2, 8, 10].each{ assert it in s }
    }

    void testSubsequences() {
        def items = [1, 2, 3]
        assert items.subsequences() == [[1, 2, 3], [1, 3], [2, 3], [1, 2], [1], [2], [3]] as Set
        assert "frog".toList().subsequences() == [
                ['f', 'r', 'o', 'g'],
                ['f', 'r', 'o'],
                ['f', 'r', 'g'],
                ['f', 'o', 'g'],
                ['r', 'o', 'g'],
                ['f', 'g'],
                ['r', 'g'],
                ['o', 'g'],
                ['f', 'o'],
                ['r', 'o'],
                ['f', 'r'],
                ['f'],
                ['r'],
                ['o'],
                ['g']
        ] as Set
    }

    void testPrettyPrintingRecursiveStructures() {
        def m = [a:1]
        m.self = m
        assert m.toMapString() == '[a:1, self:(this Map)]'

        def l = ['first']
        l << l
        assert l.toListString() == '[first, (this Collection)]'

        def animals = ['ant', 'bee', 'cat']
        animals << [pets:animals]
        assert animals.toListString(5) == '[ant, ...]'
        assert animals.toListString(10) == '[ant, bee, ...]'
        assert animals.toListString(15) == '[ant, bee, cat, ...]'
        assert animals.toListString(20) == '[ant, bee, cat, [pets:[...]]]'
        assert animals.toListString(40) == '[ant, bee, cat, [pets:[ant, bee, cat, [pets:[...]]]]]'
    }

    void testRemoveAll() {
        def items = [1, 2, 3, 4]
        assert items.removeAll{ it % 2 == 0 }
        assert items == [1, 3]
    }

    void testRetainAll() {
        def items = [1, 2, 3, 4]
        assert items.retainAll{ it % 2 == 0 }
        assert items == [2, 4]
    }

    void testPermutationsForLists() {
        def items = [1, 2, 3]
        assert items.permutations() == [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] as Set
        items = "frog".toList()
        def ans = [] as Set
        items.eachPermutation {
            ans << it
        }
        assert ans == [
                ['f', 'r', 'o', 'g'],
                ['f', 'r', 'g', 'o'],
                ['f', 'o', 'r', 'g'],
                ['f', 'o', 'g', 'r'],
                ['f', 'g', 'r', 'o'],
                ['f', 'g', 'o', 'r'],
                ['r', 'f', 'o', 'g'],
                ['r', 'f', 'g', 'o'],
                ['r', 'o', 'f', 'g'],
                ['r', 'o', 'g', 'f'],
                ['r', 'g', 'f', 'o'],
                ['r', 'g', 'o', 'f'],
                ['o', 'r', 'f', 'g'],
                ['o', 'r', 'g', 'f'],
                ['o', 'f', 'r', 'g'],
                ['o', 'f', 'g', 'r'],
                ['o', 'g', 'r', 'f'],
                ['o', 'g', 'f', 'r'],
                ['g', 'r', 'o', 'f'],
                ['g', 'r', 'f', 'o'],
                ['g', 'o', 'r', 'f'],
                ['g', 'o', 'f', 'r'],
                ['g', 'f', 'r', 'o'],
                ['g', 'f', 'o', 'r'],
        ] as Set
    }

    void testPermutationsForIterables() {
        int a = 1
        Iterable items = { [ hasNext:{ a <= 3 }, next:{ a++ } ] as Iterator } as Iterable
        assert items.permutations() == [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] as Set

        a = 0
        items = { [ hasNext:{ a <= 3 }, next:{ "frog"[a++] } ] as Iterator } as Iterable
        def ans = [] as Set
        items.eachPermutation {
            ans << it
        }
        assert ans == [
                ['f', 'r', 'o', 'g'],
                ['f', 'r', 'g', 'o'],
                ['f', 'o', 'r', 'g'],
                ['f', 'o', 'g', 'r'],
                ['f', 'g', 'r', 'o'],
                ['f', 'g', 'o', 'r'],
                ['r', 'f', 'o', 'g'],
                ['r', 'f', 'g', 'o'],
                ['r', 'o', 'f', 'g'],
                ['r', 'o', 'g', 'f'],
                ['r', 'g', 'f', 'o'],
                ['r', 'g', 'o', 'f'],
                ['o', 'r', 'f', 'g'],
                ['o', 'r', 'g', 'f'],
                ['o', 'f', 'r', 'g'],
                ['o', 'f', 'g', 'r'],
                ['o', 'g', 'r', 'f'],
                ['o', 'g', 'f', 'r'],
                ['g', 'r', 'o', 'f'],
                ['g', 'r', 'f', 'o'],
                ['g', 'o', 'r', 'f'],
                ['g', 'o', 'f', 'r'],
                ['g', 'f', 'r', 'o'],
                ['g', 'f', 'o', 'r'],
        ] as Set
    }

    void testPermutationsWithAction() {
            def items = [1, 2, 3]
            assert items.permutations { it.collect { 2*it } } as Set == [[2, 4, 6], [2, 6, 4], [4, 2, 6], [4, 6, 2], [6, 2, 4], [6, 4, 2]] as Set
    }

    void testStringTranslate() {
        assert StringUtil.tr("abcdefghijklmn", "abcdefghijklmn", "ABCDEFGHIJKLMN") == "ABCDEFGHIJKLMN"
        assert StringUtil.tr("abcdefghijklmn", "abc", "ABC") == "ABCdefghijklmn"
        assert StringUtil.tr("abcdefghijklmn", "ace", "ACE") == "AbCdEfghijklmn"
        assert StringUtil.tr("abcdefghijklmn", "afghn", "AFGHN") == "AbcdeFGHijklmN"
        assert StringUtil.tr("abcdefghijklmn", "xyz", "XYZ") == "abcdefghijklmn"
        assert StringUtil.tr("abcdefghijklmn", "", "") == "abcdefghijklmn"
    }

    void testTr_Expand() {
        assert StringUtil.tr("abcdefghijklmn", "a-n", "ABCDEFGHIJKLMN") == "ABCDEFGHIJKLMN"
        assert StringUtil.tr("abcdefghijklmn", "abcdefghijklmn", "A-N") == "ABCDEFGHIJKLMN"
        assert StringUtil.tr("abcdefghijklmn", "a-n", "A-N") == "ABCDEFGHIJKLMN"
        assert StringUtil.tr("abcdefghijklmn", "a-c", "A-C") == "ABCdefghijklmn"
        assert StringUtil.tr("abcdefghijklmn", "af-hn", "AF-HN") == "AbcdeFGHijklmN"
        assert StringUtil.tr("abcdefghijklmn", "x-z", "X-Z") == "abcdefghijklmn"
        assert StringUtil.tr("abcdefghijklmn", "a-cfj-l", "A-CFJ-L") == "ABCdeFghiJKLmn"
        assert StringUtil.tr("-abc-", "-", "*") == "*abc*"
        assert StringUtil.tr("-abcdef--ghijklmn-", "-cfj-l", "*CFJ-L") == "*abCdeF**ghiJKLmn*"
        assert StringUtil.tr("abcdefghijklmn", "a-n", "A-C") == "ABCCCCCCCCCCCC"
        assert StringUtil.tr("abcdefghijklmn", "a-c", "A-N") == "ABCdefghijklmn"
        assert 'hello'.tr('aeiou', 'AEIOU') == 'hEllO'
        assert 'Hello World!'.tr('a-z', 'A') == 'HAAAA WAAAA!'
        assert 'Hello World!'.tr('a-z', 'A-Z') == 'HELLO WORLD!'
        assert 'Hello World!'.tr('z-a', 'Z-A') == 'HELLO WORLD!'
        assert 'Hello World!'.tr('lloo', '1234') == 'He224 W4r2d!'
        assert 'Hello-World!'.tr('a-d-f-m-s', '_') == 'He__o_Wor__!'
        assert 'Hello-World!'.tr('--a', 'Z') == 'ZelloZZorld!'
        assert 'Hello, World!'.tr(' --', 'Z') == 'HelloZZWorldZ'
    }

    void testListTake() {
        def data = [
            new ArrayList( [ 1, 2, 3 ] ),
            new LinkedList( [ 1, 2, 3 ] ),
            new Stack() {{ addAll( [ 1, 2, 3 ] ) }},
            new Vector( [ 1, 2, 3 ] ),
        ]
        data.each {
            assert it.take( -1 ) == []
            assert it.take(  0 ) == []
            assert it.take(  2 ) == [ 1, 2 ]
            assert it.take(  4 ) == [ 1, 2, 3 ]

            assert it.takeRight( -1 ) == []
            assert it.takeRight(  0 ) == []
            assert it.takeRight(  2 ) == [ 2, 3 ]
            assert it.takeRight(  4 ) == [ 1, 2, 3 ]
        }
    }

    void testArrayTake() {
        String[] items = [ 'ant', 'bee', 'cat' ]

        assert items.take( -1 ) == [] as String[]
        assert items.take(  0 ) == [] as String[]
        assert items.take(  2 ) == [ 'ant', 'bee' ] as String[]
        assert items.take(  4 ) == [ 'ant', 'bee', 'cat' ] as String[]

        assert items.takeRight( -1 ) == [] as String[]
        assert items.takeRight(  0 ) == [] as String[]
        assert items.takeRight(  2 ) == [ 'bee', 'cat' ] as String[]
        assert items.takeRight(  4 ) == [ 'ant', 'bee', 'cat' ] as String[]
    }

    void testMapTake() {
        def data = [
            [ 'ant':10, 'bee':20, 'cat':30, 'dog':40 ],
            new TreeMap( [ 'ant':10, 'bee':20, 'cat':30, 'dog':40 ] ),
        ]
        data.each {
            assert it.take( -1 ) == [:]
            assert it.take(  0 ) == [:]
            assert it.take(  2 ) == [ 'ant':10, 'bee':20 ]
            assert it.take(  4 ) == [ 'ant':10, 'bee':20, 'cat':30, 'dog':40 ]
            assert it.take(  5 ) == [ 'ant':10, 'bee':20, 'cat':30, 'dog':40 ]
        }
    }

    void testIteratorTake() {
        int a = 1
        Iterator items = [ hasNext:{ true }, next:{ a++ } ] as Iterator

        assert items.take( -1 ).collect { it } == []
        assert items.take(  0 ).collect { it } == []
        assert items.take(  2 ).collect { it } == [ 1, 2 ]
        assert items.take(  4 ).collect { it } == [ 3, 4, 5, 6 ]
    }

    void testWellBehavedIteratorsForInfiniteStreams() {
        int a = 1
        def infiniterator = [ hasNext:{ true }, next:{ a++ } ] as Iterator
        assert infiniterator.drop(3).dropWhile{ it < 9 }.toUnique{ it % 100 }.init().tail().take(3).toList() == [10, 11, 12]
    }

    void testIterableTake() {
        int a = 1
        Iterable items = { [ hasNext:{ true }, next:{ a++ } ] as Iterator } as Iterable

        assert items.take( -1 ).collect { it } == []
        assert items.take(  0 ).collect { it } == []
        assert items.take(  2 ).collect { it } == [ 1, 2 ]
        assert items.take(  4 ).collect { it } == [ 3, 4, 5, 6 ]

        items = { [ hasNext:{ a < 6 }, next:{ a++ } ] as Iterator } as Iterable

        assert items.takeRight( -1 ).collect { it } == []
        a = 1
        assert items.takeRight(  0 ).collect { it } == []
        a = 1
        assert items.takeRight(  2 ).collect { it } == [ 4, 5 ]
        a = 1
        assert items.takeRight(  4 ).collect { it } == [ 2, 3, 4, 5 ]
    }

    void testCharSequenceTake() {
        def data = [ 'groovy',      // String
                     "${'groovy'}", // GString
                     java.nio.CharBuffer.wrap( 'groovy' ),
                     new StringBuffer( 'groovy' ),
                     new StringBuilder( 'groovy' ) ]
        data.each {
            // Need toString() as CharBuffer.subSequence returns a java.nio.StringCharBuffer
            assert it.take( -1 ).toString() == ''
            assert it.take(  0 ).toString() == ''
            assert it.take(  3 ).toString() == 'gro'
            assert it.take(  6 ).toString() == 'groovy'
            assert it.take( 10 ).toString() == 'groovy'
        }
    }

    void testListDrop() {
        def data = [
            new ArrayList( [ 1, 2, 3 ] ),
            new LinkedList( [ 1, 2, 3 ] ),
            new Stack() {{ addAll( [ 1, 2, 3 ] ) }},
            new Vector( [ 1, 2, 3 ] ),
        ]
        data.each {
            assert it.drop( -1 ) == [ 1, 2, 3 ]
            assert it.drop(  0 ) == [ 1, 2, 3 ]
            assert it.drop(  2 ) == [ 3 ]
            assert it.drop(  4 ) == []

            assert it.dropRight( -1 ) == [ 1, 2, 3 ]
            assert it.dropRight(  0 ) == [ 1, 2, 3 ]
            assert it.dropRight(  2 ) == [ 1 ]
            assert it.dropRight(  4 ) == []
        }
    }

    void testArrayDrop() {
        String[] items = [ 'ant', 'bee', 'cat' ]

        assert items.drop(  2 ) == [ 'cat' ] as String[]
        assert items.drop(  4 ) == [] as String[]
        assert items.drop(  0 ) == [ 'ant', 'bee', 'cat' ] as String[]
        assert items.drop( -1 ) == [ 'ant', 'bee', 'cat' ] as String[]

        assert items.dropRight(  2 ) == [ 'ant' ] as String[]
        assert items.dropRight(  4 ) == [] as String[]
        assert items.dropRight(  0 ) == [ 'ant', 'bee', 'cat' ] as String[]
        assert items.dropRight( -1 ) == [ 'ant', 'bee', 'cat' ] as String[]
    }

    void testMapDrop() {
        def data = [
            [ 'ant':10, 'bee':20, 'cat':30, 'dog':40 ],
            new TreeMap( [ 'ant':10, 'bee':20, 'cat':30, 'dog':40 ] ),
        ]
        data.each {
            assert it.drop( -1 ) == [ 'ant':10, 'bee':20, 'cat':30, 'dog':40 ]
            assert it.drop(  0 ) == [ 'ant':10, 'bee':20, 'cat':30, 'dog':40 ]
            assert it.drop(  2 ) == [ 'cat':30, 'dog':40 ]
            assert it.drop(  4 ) == [ : ]
            assert it.drop(  5 ) == [ : ]
        }
    }

    void testIteratorDrop() {
        int a = 1
        Iterator items = [ hasNext:{ a < 6 }, next:{ a++ } ] as Iterator

        assert items.drop( 0 ).collect { it } == [ 1, 2, 3, 4, 5 ]
        a = 1
        assert items.drop( 2 ).collect { it } == [ 3, 4, 5 ]
        a = 1
        assert items.drop( 4 ).collect { it } == [ 5 ]
        a = 1
        assert items.drop( 5 ).collect { it } == []

        a = 1
        assert items.dropRight( 0 ).collect { it } == [ 1, 2, 3, 4, 5 ]
        a = 1
        assert items.dropRight( 2 ).collect { it } == [ 1, 2, 3 ]
        a = 1
        assert items.dropRight( 4 ).collect { it } == [ 1 ]
        a = 1
        assert items.dropRight( 5 ).collect { it } == []

        // if we ever traverse the whole exploding list we'll get a RuntimeException
        assert new ExplodingList('letters'.toList(), 4).iterator().dropRight(1).drop(1).take(1).toList() == ['e']
    }

    void testIterableDrop() {
        int a = 1
        Iterable items = { [ hasNext:{ a < 6 }, next:{ a++ } ] as Iterator } as Iterable

        assert items.drop( 0 ).collect { it } == [ 1, 2, 3, 4, 5 ]
        a = 1
        assert items.drop( 2 ).collect { it } == [ 3, 4, 5 ]
        a = 1
        assert items.drop( 4 ).collect { it } == [ 5 ]
        a = 1
        assert items.drop( 5 ).collect { it } == []

        a = 1
        assert items.dropRight( 0 ).collect { it } == [ 1, 2, 3, 4, 5 ]
        a = 1
        assert items.dropRight( 2 ).collect { it } == [ 1, 2, 3 ]
        a = 1
        assert items.dropRight( 4 ).collect { it } == [ 1 ]
        a = 1
        assert items.dropRight( 5 ).collect { it } == []
    }

    void testCharSequenceDrop() {
        def data = [ 'groovy',      // String
                     "${'groovy'}", // GString
                     java.nio.CharBuffer.wrap( 'groovy' ),
                     new StringBuffer( 'groovy' ),
                     new StringBuilder( 'groovy' ) ]
        data.each {
            // Need toString() as CharBuffer.subSequence returns a java.nio.StringCharBuffer
            assert it.drop( -1 ).toString() == 'groovy'
            assert it.drop(  0 ).toString() == 'groovy'
            assert it.drop(  3 ).toString() == 'ovy'
            assert it.drop(  6 ).toString() == ''
            assert it.drop( 10 ).toString() == ''
        }
    }

    void testTakeDropClassSymmetry() {
        int a
        // NOTES:
        // - Cannot test plain HashMap, as Groovy will always default to a LinkedHashMap
        //   See org.codehaus.groovy.runtime.DefaultGroovyMethodsSupport.java:183
        // - Cannot test StringBuffer or StringBuilder, as X.subSequence in Java returns String
        def data = [
          // Lists
          (java.util.ArrayList)     : new ArrayList( [ 1, 2, 3 ] ),
          (java.util.LinkedList)    : new LinkedList( [ 1, 2, 3 ] ),
          (java.util.Stack)         : new Stack() {{ addAll( [ 1, 2, 3 ] ) }},
          (java.util.Vector)        : new Vector( [ 1, 2, 3 ] ),
          // Maps
          (java.util.LinkedHashMap) : new LinkedHashMap( [ a:1, b:2, c:3 ] ),
          (java.util.TreeMap)       : new TreeMap( [ a:1, b:2, c:3 ] ),
          (java.util.Hashtable)     : new Hashtable( [ a:1, b:2, c:3 ] ),
          // Iterators
          (java.util.Iterator)      : [ hasNext:{ true }, next:{ 'groovy' } ] as Iterator,
          // Iterables
          (java.lang.Iterable)      : { [ hasNext:{ a < 6 }, next:{ a++ } ] as Iterator } as Iterable,
          // CharSequences
          (java.lang.String)        : new String( 'groovy' ),
          (java.nio.CharBuffer)     : java.nio.CharBuffer.wrap( 'groovy' ),
        ]
        data.each { Class clazz, object ->
            a = 1
            assert clazz.isInstance( object.take( 5 ) )
            a = 1
            assert clazz.isInstance( object.drop( 5 ) )
        }

        data = [
          // Lists
          (java.util.ArrayList)     : new ArrayList( [ 1, 2, 3 ] ),
          (java.util.LinkedList)    : new LinkedList( [ 1, 2, 3 ] ),
          (java.util.Stack)         : new Stack() {{ addAll( [ 1, 2, 3 ] ) }},
          (java.util.Vector)        : new Vector( [ 1, 2, 3 ] ),
          // Iterables
          (java.lang.Iterable)      : { [ hasNext:{ a < 6 }, next:{ a++ } ] as Iterator } as Iterable,
        ]
        data.each { Class clazz, object ->
            a = 1
            assert clazz.isInstance( object.takeRight( 5 ) )
            a = 1
            assert clazz.isInstance( object.dropRight( 5 ) )
        }
    }

    void testContainsForPrimitiveArrays() {
        boolean[] bools = [false]
        byte[] bytes = [1, 3]
        short[] shorts = [1, 3]
        int[] ints = [1, 3]
        long[] longs = [1, 3]
        float[] floats = [1.0f, 3.0f]
        double[] doubles = [1.0d, 3.0d]
        char[] chars = ['a' as char, 'c' as char]

        assert bools.contains(false)
        assert !bools.contains(true)
        assert bytes.contains(3)
        assert !bytes.contains(2)
        assert shorts.contains(3)
        assert !shorts.contains(2)
        assert ints.contains(3)
        assert !ints.contains(2)
        assert longs.contains(3)
        assert !longs.contains(2)
        assert longs.contains(3)
        assert !longs.contains(2)
        assert floats.contains(3.0f)
        assert !floats.contains(2.0f)
        assert doubles.contains(3.0d)
        assert !doubles.contains(2.0d)
        assert chars.contains('c' as char)
        assert !chars.contains('b' as char)
    }

    void testContainsForArrays() {
        String[] vowels = ['a', 'e', 'i', 'o', 'u']
        assert vowels.contains('u')
        assert !vowels.contains('x')
    }

    void testContainsForLists() {
        List vowels = ['a', 'e', 'i', 'o', 'u']
        assert vowels.contains('u')
        assert !vowels.contains('x')
    }

    void testContainsForIterables() {
        int a
        Iterable iterable = { [hasNext: { a < 6 }, next: { a++ }] as Iterator } as Iterable

        a = 1
        assert iterable.contains(5)
        a = 1
        assert !iterable.contains(6)

        iterable = { [hasNext: { a < 6 }, next: { a++; null }] as Iterator } as Iterable
        a = 1
        assert iterable.contains(null)
        a = 1
        assert !iterable.contains("a")
    }

    void testContainsAllForLists() {
        List vowels = ['a', 'e', 'i', 'o', 'u']
        assert vowels.containsAll([] as String[])
        assert vowels.containsAll(['e', 'u'] as String[])
        assert !vowels.containsAll(['a', 'x'] as String[])
    }

    void testContainsAllForIterables() {
        int a
        Iterable iterable = { [hasNext: { a < 6 }, next: { a++ }] as Iterator } as Iterable

        a = 1
        assert iterable.containsAll([] as int[])
        a = 1
        assert iterable.containsAll([2, 5] as int[])
        a = 1
        assert !iterable.containsAll([1, 6] as int[])
    }

    void testCollectEntriesIterator() {
        def items = ['a', 'bb', 'ccc'].iterator()
        def map = items.collectEntries { [it, it.size()] }
        assert map == [a: 1, bb: 2, ccc: 3]
    }

    void testCollectEntriesIterable() {
        def things = new Things()
        def map = things.collectEntries { [it.toLowerCase(), it.toUpperCase()] }
        assert map == [a: 'A', b: 'B', c: 'C']
    }

    void testCollectEntriesListFallbackCases() {
        assert [[[1,'a'], [2,'b'], [3]].collectEntries(),
                [[1,'a'], [2,'b'], []].collectEntries(),
                [[1,'a'], [2,'b'], [3, 'c', 42]].collectEntries()] == [[1:'a', 2:'b', 3:null], [1:'a', 2:'b', (null):null], [1:'a', 2:'b', 3:'c']]
        shouldFail(NullPointerException) {
            [[1, 'a'], [3]].collectEntries(new Hashtable())
        }
    }

    void testCollectEntriesWithArray() {
        def cityList = '1 San Francisco,2 Cupertino'
        def cityMap = cityList.split(',').
                collectEntries{ it.split(' ', 2) }
        assert cityMap == ['1': 'San Francisco', '2': 'Cupertino']
    }

    void testListTakeWhile() {
        def data = [
            new ArrayList( [ 1, 3, 2 ] ),
            new LinkedList( [ 1, 3, 2 ] ),
            new Stack() {{ addAll( [ 1, 3, 2 ] ) }},
            new Vector( [ 1, 3, 2 ] ),
        ]
        data.each {
            assert it.takeWhile{ it < 0 } == []
            assert it.takeWhile{ it < 1 } == []
            assert it.takeWhile{ it < 3 } == [ 1 ]
            assert it.takeWhile{ it < 4 } == [ 1, 3, 2 ]
        }
    }

    void testArrayTakeWhile() {
        String[] items = [ 'ant', 'bee', 'cat' ]

        assert items.takeWhile{ it == '' } == [] as String[]
        assert items.takeWhile{ it != 'cat' } == [ 'ant', 'bee' ] as String[]
        assert items.takeWhile{ it != '' } == [ 'ant', 'bee', 'cat' ] as String[]
    }

    void testIteratorTakeWhile() {
        int a = 1
        Iterator items = [ hasNext:{ true }, next:{ a++ } ] as Iterator

        assert items.takeWhile{ it < 5 }.collect { it } == [ 1, 2, 3, 4 ]
    }

    void testCharSequenceTakeWhile() {
        def data = [ 'groovy',      // String
                     "${'groovy'}", // GString
                     java.nio.CharBuffer.wrap( 'groovy' ),
                     new StringBuffer( 'groovy' ),
                     new StringBuilder( 'groovy' ) ]
        data.each {
            assert it.takeWhile{ it == '' } == ''
            assert it.takeWhile{ it != 'v' } == 'groo'
            assert it.takeWhile{ it } == 'groovy'
        }
    }

    void testInjectWithoutIntialValue() {
        int a = 1
        def data = [
                new ArrayList([1, 2, 3]),
                new LinkedList([1, 2, 3]),
                new Stack() {{ addAll([1, 2, 3]) }},
                new Vector([1, 2, 3]),
                [1, 2, 3] as int[],
                { [hasNext: { a <= 3 }, next: { a++ }] as Iterator } as Iterable,
        ]
        data.each {
            assert it.inject { int acc, int val -> acc + val } == 6
        }
    }

    void testInjectWithIntialValue() {
        int a = 1
        def data = [
                new ArrayList(["a", "aa", "aaa"]),
                new LinkedList(["a", "aa", "aaa"]),
                new Stack() {{ addAll(["a", "aa", "aaa"]) }},
                new Vector(["a", "aa", "aaa"]),
                ["a", "aa", "aaa"] as String[],
                { [hasNext: { a <= 3 }, next: { "a" * (a++) }] as Iterator } as Iterable,
        ]
        data.each {
            assert it.inject(10) { int acc, String val -> acc + val.length() } == 16
        }
    }

    void testIntersectForLists() {
        assert [] == [].intersect([4, 5, 6, 7, 8])
        assert [] == [1, 2, 3, 4, 5].intersect([])
        assert [4, 5] == [1, 2, 3, 4, 5].intersect([4, 5, 6, 7, 8])
        assert [[0, 1]] == [[0, 0], [0, 1]].intersect([[0, 1], [1, 1]])
    }

    void testIntersectForIterables() {
        int a = 1, b = 4
        Iterable iterableA = { [ hasNext:{ a <= 5 }, next:{ a++ } ] as Iterator } as Iterable
        Iterable iterableB = { [ hasNext:{ b <= 8 }, next:{ b++ } ] as Iterator } as Iterable
        Iterable iterableEmpty = { [ hasNext:{ false }, next:{ 0 } ] as Iterator } as Iterable

        assert [] == iterableEmpty.intersect(iterableB)
        assert [] == iterableA.intersect(iterableEmpty)
        a = 1
        b = 4
        assert [4, 5] == iterableA.intersect(iterableB)
    }

    void testIntersectForSets() {
        assert [].toSet() == [].toSet().intersect([] as Iterable)
        assert [].toSet() == [].toSet().intersect([1, 2, 3] as Iterable)
        assert [].toSet() == [1, 2, 3].toSet().intersect([] as Iterable)
        assert [2, 3].toSet() == [2, 3, 4].toSet().intersect([1, 2, 3] as Iterable)
        assert [2, 3, 4].toSet() == [2, 3, 4].toSet().intersect([1, 2, 3, 4] as Iterable)
        assert [2, 3].toSet() == [2, 3, 4, 5].toSet().intersect([1, 2, 3] as Iterable)
    }

    void testIntersectForMaps() {
        // GROOVY-7602
        def list1 = [[language: 'Java'], [language: 'Groovy'], [language: 'Scala']]
        def list2 = [[language: 'Groovy'], [language: 'JRuby'], [language: 'Java']]
        def intersection = list1.intersect(list2)
        assert intersection == [[language: 'Groovy'], [language: 'Java']]

        def locs1 = [[loc: [0, 1]], [loc: [1, 1]]]
        def locs2 = [[loc: [2, 1]], [loc: [1, 1]]]
        def locInter = [[loc: [1, 1]]]
        assert [[loc: [1, 1]]] == locs1.intersect(locs2)
    }

    // GROOVY-7602
    void testIntersectForURL() {
        def c1 = []
        def c2 = []
        c1 << new URL("http://sample.com/")
        c2 << new URL("http://sample.com/")
        assert c1.intersect(c2)
    }

    void testDisjointForMaps() {
        // GROOVY-7530
        def list1 = [[language: 'Java'], [language: 'Groovy'], [language: 'Scala']]
        def list2 = [[language: 'Groovy'], [language: 'JRuby'], [language: 'Java']]
        assert !list1.disjoint(list2)

        def locs1 = [[loc: [0, 1]], [loc: [1, 1]]]
        def locs2 = [[loc: [2, 1]], [loc: [1, 1]]]
        assert !locs1.disjoint(locs2)
    }

    class Foo {
        private String name

        Foo(String name) {
            this.name = name
        }

        boolean equals(Object o) {
            if (this.is(o)) return true
            if (o == null || getClass() != o.getClass()) return false
            name == o.name
        }

        int hashCode() {
            return 13 + 7 * name.hashCode()
        }
    }

    // GROOVY-7530
    void testDisjointForFoo() {
        def a = [new Foo("foo")]
        def b = [new Foo("foo")]
        assert !a.disjoint(b)
    }

    void testDisjointForLists() {
        assert [].disjoint([])
        assert [].disjoint([4, 5, 6, 7, 8])
        assert [1, 2, 3, 4, 5].disjoint([])
        assert ![1, 2, 3, 4, 5].disjoint([4, 5, 6, 7, 8])
        assert [1, 2, 3].disjoint([4, 5, 6, 7, 8])
        assert ![[0, 0], [0, 1]].disjoint([[0, 1], [1, 1]])
    }

    void testDisjointForIterables() {
        int a = 1, b = 4
        Iterable iterableA = { [ hasNext:{ a <= 5 }, next:{ a++ } ] as Iterator } as Iterable
        Iterable iterableB = { [ hasNext:{ b <= 8 }, next:{ b++ } ] as Iterator } as Iterable
        Iterable iterableEmpty = { [ hasNext:{ false }, next:{0 } ] as Iterator } as Iterable

        assert iterableEmpty.disjoint(iterableB)
        assert iterableA.disjoint(iterableEmpty)
        a = 1
        b = 4
        assert !iterableA.disjoint(iterableB)
        a = 1
        b = 6
        assert iterableA.disjoint(iterableB)
    }

    void testAsCollectionForIterables() {
        int a = 1
        Iterable iterable = { [ hasNext:{ a <= 3 }, next:{ a++ } ] as Iterator } as Iterable
        assert [1, 2, 3] == iterable.asCollection()
    }

    void testToSetForIterables() {
        int a = 1
        Iterable iterable = { [ hasNext:{ a <= 3 }, next:{ a++ } ] as Iterator } as Iterable
        assert ([1, 2, 3] as Set) == iterable.toSet()
    }

    void testToSpreadMapForArrays() {
        def spreadMap = ([1, 2, 3, 4] as Integer[]).toSpreadMap()
        assert 2 == spreadMap.size()
        assert 2 == spreadMap[1]
        assert 4 == spreadMap[3]
        assert !spreadMap.containsKey(5)
    }

    void testToSpreadMapForLists() {
        def spreadMap = [1, 2, 3, 4].toSpreadMap()
        assert 2 == spreadMap.size()
        assert 2 == spreadMap[1]
        assert 4 == spreadMap[3]
        assert !spreadMap.containsKey(5)
    }

    void testToSpreadMapForIterables() {
        int a = 1
        Iterable iterable = { [ hasNext:{ a <= 4 }, next:{ a++ } ] as Iterator } as Iterable
        def spreadMap = iterable.toSpreadMap()
        assert 2 == spreadMap.size()
        assert 2 == spreadMap[1]
        assert 4 == spreadMap[3]
        assert !spreadMap.containsKey(5)
    }

    void testPlusMinusClassSymmetryForCollections() {
        int a
        def data = [
                // Lists
                (java.util.ArrayList)     : new ArrayList( [ 1, 2, 3 ] ),
                (java.util.LinkedList)    : new LinkedList( [ 1, 2, 3 ] ),
                (java.util.Stack)         : new Stack() {{ addAll( [ 1, 2, 3 ] ) }},
                (java.util.Vector)        : new Vector( [ 1, 2, 3 ] ),
                // Sets
                (java.util.HashSet)       : new HashSet( [ 1, 2, 3 ] ),
                // Iterables
                (java.util.Collection)    : { [ hasNext:{ a <= 3 }, next:{ a++ } ] as Iterator } as Iterable,
        ]
        data.each { Class clazz, object ->
            a = 1
            assert clazz.isInstance( object + 1 )
            a = 1
            assert clazz.isInstance( object - 1 )
            a = 1
            assert clazz.isInstance( object + [1, 2] )
            a = 1
            assert clazz.isInstance( object - [1, 2] )
        }
    }

    void testPlusForLists() {
        assert [1, 2, 3] == [1, 2] + 3

        int a = 3
        Iterable iterable = { [ hasNext:{ a <= 4 }, next:{ a++ } ] as Iterator } as Iterable
        assert [1, 2, 3, 4] == [1, 2] + iterable

        assert [1, 2, 3, 4] == [1, 2] + [3, 4]
    }

    void testPlusForIterables() {
        int a, b
        Iterable iterableA = { [ hasNext:{ a <= 2 }, next:{ a++ } ] as Iterator } as Iterable
        Iterable iterableB = { [ hasNext:{ b <= 4 }, next:{ b++ } ] as Iterator } as Iterable
        Iterable iterableEmpty = { [ hasNext:{ false }, next:{ 0 } ] as Iterator } as Iterable

        assert [1] == iterableEmpty + 1
        a = 1
        assert [1, 2] == iterableEmpty + iterableA
        assert [1, 2] == iterableEmpty + [1, 2]

        // Iterable.plus(Object)
        a = 1
        assert [1, 2, 3] == iterableA + 3

        // Iterable.plus(Iterable)
        a = 1
        b = 3
        assert [1, 2, 3, 4] == iterableA + iterableB

        // Iterable.plus(List)
        a = 1
        assert [1, 2, 3, 4] == iterableA + [3, 4]
    }

    void testMinusForIterables() {
        int a, b
        Iterable iterableA = { [ hasNext:{ a <= 2 }, next:{ a++ } ] as Iterator } as Iterable
        Iterable iterableB = { [ hasNext:{ b <= 4 }, next:{ b++ } ] as Iterator } as Iterable
        Iterable iterableEmpty = { [ hasNext:{ false }, next:{ 0 } ] as Iterator } as Iterable

        assert [] == iterableEmpty - 1
        a =1
        assert [] == iterableEmpty - iterableA
        a =1
        assert [1, 2] ==iterableA - iterableEmpty
        assert [] == iterableEmpty - [1, 2]

        // Iterable.minus(Object)
        a = 1
        assert [2] == iterableA - 1

        // Iterable.minus(Iterable)
        a = 1
        b = 3
        assert [3, 4] == iterableB - iterableA

        // Iterable.minus(List)
        b = 3
        assert [3, 4] == iterableB - [1, 2]
    }

    void testMultiplyForLists() {
        assert [] == [] * 3
        assert [1, 2, 1, 2, 1, 2] == [1, 2] * 3
    }

    void testMultiplyForIterables() {
        Iterable iterableEmpty = { [ hasNext:{ false }, next:{ 0 } ] as Iterator } as Iterable
        assert [] == iterableEmpty * 3

        int a = 1
        Iterable iterable = { [ hasNext:{ a <= 2 }, next:{ a++ } ] as Iterator } as Iterable
        assert [1, 2, 1, 2, 1, 2] == iterable * 3
    }

    void testSwap() {
        assert [1, 2, 3, 4] == [1, 2, 3, 4].swap(0, 0).swap(1, 1)

        assert [1, 3, 4, 2] == [1, 2, 3, 4].swap(1, 2).swap(2, 3)
        assert (["a", "c", "d", "b"] as String[]) == (["a", "b", "c", "d"] as String[]).swap(1, 2).swap(2, 3)
        assert ([false, true, true, false] as boolean[]) == ([false, false, true, true] as boolean[]).swap(1, 2).swap(2, 3)
        assert ([1, 3, 4, 2] as byte[]) == ([1, 2, 3, 4] as byte[]).swap(1, 2).swap(2, 3)
        assert ([1, 3, 4, 2] as char[]) == ([1, 2, 3, 4] as char[]).swap(1, 2).swap(2, 3)
        assert ([1, 3, 4, 2] as double[]) == ([1, 2, 3, 4] as double[]).swap(1, 2).swap(2, 3)
        assert ([1, 3, 4, 2] as float[]) == ([1, 2, 3, 4] as float[]).swap(1, 2).swap(2, 3)
        assert ([1, 3, 4, 2] as int[]) == ([1, 2, 3, 4] as int[]).swap(1, 2).swap(2, 3)
        assert ([1, 3, 4, 2] as long[]) == ([1, 2, 3, 4] as long[]).swap(1, 2).swap(2, 3)
        assert ([1, 3, 4, 2] as short[]) == ([1, 2, 3, 4] as short[]).swap(1, 2).swap(2, 3)

        shouldFail(IndexOutOfBoundsException) {
            [].swap(1, 2)
        }
        shouldFail(ArrayIndexOutOfBoundsException) {
            ([] as String[]).swap(1, 2)
        }
        shouldFail(ArrayIndexOutOfBoundsException) {
            ([] as int[]).swap(1, 2)
        }
    }

    void testCharSequenceTakeRight() {
        def data = ['groovy',      // String
                    "${'groovy'}", // GString
                    java.nio.CharBuffer.wrap('groovy'),
                    new StringBuffer('groovy'),
                    new StringBuilder('groovy')]
        data.each {
            // Need toString() as CharBuffer.subSequence returns a java.nio.StringCharBuffer
            assert it.takeRight(-1).toString() == ''
            assert it.takeRight(0).toString() == ''
            assert it.takeRight(3).toString() == 'ovy'
            assert it.takeRight(6).toString() == 'groovy'
            assert it.takeRight(10).toString() == 'groovy'
        }
    }

    void testCharSequenceTakeAfter() {
        def text = 'Groovy development. Groovy team'

        def data = [text,      // String
                    "${text}", // GString
                    java.nio.CharBuffer.wrap(text),
                    new StringBuffer(text),
                    new StringBuilder(text)]

        List<List<String>> searchStringsAndResults = [

                ['Groovy', ' development. Groovy team'],
                ['team', ''],
                ['Java.', ''],
                ['Unavailable text', ''],
                ['Some larger String than self', ''],
                ['', ''],
                [null, '']
        ]

        data.each { s ->

            searchStringsAndResults.each { r ->

                // Need toString() as CharBuffer.subSequence returns a java.nio.StringCharBuffer

                assert s.takeAfter(r[0]).toString() == r[1]                //String as searchString
                assert s.takeAfter("${r[0]}").toString() == r[1]  //GString as searchString

                if (r[0]) {
                    assert s.takeAfter(java.nio.CharBuffer.wrap(r[0])).toString() == r[1] //CharBuffer as searchString
                    assert s.takeAfter(new StringBuffer(r[0])).toString() == r[1]  //StringBuffer as searchString
                    assert s.takeAfter(new StringBuilder(r[0])).toString() == r[1] //StringBuilder as searchString
                }
            }
        }

    }

    void testCharSequenceTakeBefore() {
        def text = "Groovy development. Groovy team"

        def data = [text,      // String
                    "${text}", // GString
                    java.nio.CharBuffer.wrap(text),
                    new StringBuffer(text),
                    new StringBuilder(text)]

        List<List<String>> searchStringsAndResults = [

                [' Groovy ', 'Groovy development.'],
                ['Groovy', ''],
                [' ', 'Groovy'],
                ['Unavailable text', ''],
                ['Some larger String than self', ''],
                ['r', 'G'],
                ['', ''],
                [null, '']
        ]

        data.each { s ->

            searchStringsAndResults.each { r ->

                // Need toString() as CharBuffer.subSequence returns a java.nio.StringCharBuffer

                assert s.takeBefore(r[0]).toString() == r[1]                //String as searchString
                assert s.takeBefore("${r[0]}").toString() == r[1]  //GString as searchString

                if (r[0]) {
                    assert s.takeBefore(java.nio.CharBuffer.wrap(r[0])).toString() == r[1] //CharBuffer as searchString
                    assert s.takeBefore(new StringBuffer(r[0])).toString() == r[1]  //StringBuffer as searchString
                    assert s.takeBefore(new StringBuilder(r[0])).toString() == r[1] //StringBuilder as searchString
                }
            }
        }

    }

    void testCharSequenceDropRight() {
        def data = ['groovy',      // String
                    "${'groovy'}", // GString
                    java.nio.CharBuffer.wrap('groovy'),
                    new StringBuffer('groovy'),
                    new StringBuilder('groovy')]
        data.each {
            // Need toString() as CharBuffer.subSequence returns a java.nio.StringCharBuffer
            assert it.dropRight(-1).toString() == 'groovy'
            assert it.dropRight(0).toString() == 'groovy'
            assert it.dropRight(3).toString() == 'gro'
            assert it.dropRight(6).toString() == ''
            assert it.dropRight(10).toString() == ''
        }
    }

    void testCharSequenceTakeBetween() {

        def text = 'Time taken for Select Query = 12 ms, Update Query = 15 ms. Result = "One", "Two"'

        def data = [text,      // String
                    "${text}", // GString
                    java.nio.CharBuffer.wrap(text),
                    new StringBuffer(text),
                    new StringBuilder(text)]

        data.each { s ->

            List<List<String>> fromToCasesWithoutNum = [

                    ['Query = ', ' ms', '12'], //positive case
                    ['Query = ', ' MS', ''],   //negative case with invalid 'to'
                    ['Query123 = ', ' ms', '']     //negative case with invalid 'from'
            ]

            fromToCasesWithoutNum.each { r ->

                assert s.takeBetween(r[0], r[1]).toString() == r[2]
                assert s.takeBetween("${r[0]}", "${r[1]}").toString() == r[2]

                if (r[0] && r[1]) {
                    assert s.takeBetween(CharBuffer.wrap(r[0]), CharBuffer.wrap(r[1])).toString() == r[2]
                    assert s.takeBetween(new StringBuffer(r[0]), CharBuffer.wrap(r[1])).toString() == r[2]
                    assert s.takeBetween(CharBuffer.wrap(r[0]), new StringBuilder(r[1])).toString() == r[2]
                }
            }
        }

        data.each { s ->

            List<List<String>> enclosureWithoutNum = [

                    ['"', 'One'],               //positive case
                    ['Query', ' = 12 ms, Update '], //negative case with invalid enclosure
                    ['Query123', '']                   //negative case with invalid enclosure
            ]

            enclosureWithoutNum.each { r ->

                assert s.takeBetween(r[0]).toString() == r[1]
                assert s.takeBetween("${r[0]}").toString() == r[1]

                if (r[0] && r[1]) {
                    assert s.takeBetween(CharBuffer.wrap(r[0])).toString() == r[1]
                    assert s.takeBetween(new StringBuffer(r[0])).toString() == r[1]
                    assert s.takeBetween(new StringBuilder(r[0])).toString() == r[1]
                }
            }
        }

        data.each { s ->

            List<List<Object>> fromToCasesWithNum = [

                    ['Query = ', ' ms', 1, '15'],
                    ['Query = ', ' ms', 2, '']
            ]

            fromToCasesWithNum.each { r ->

                assert s.takeBetween(r[0], r[1], r[2]).toString() == r[3]
                assert s.takeBetween("${r[0]}", "${r[1]}", r[2]).toString() == r[3]

                if (r[0] && r[1]) {
                    assert s.takeBetween(CharBuffer.wrap(r[0]), CharBuffer.wrap(r[1]), r[2]).toString() == r[3]
                    assert s.takeBetween(new StringBuffer(r[0]), new StringBuffer(r[1]), r[2]).toString() == r[3]
                    assert s.takeBetween(new StringBuilder(r[0]), new StringBuilder(r[1]), r[2]).toString() == r[3]
                }
            }
        }

        data.each { s ->

            List<List<Object>> enclosureWithNum = [

                    ['"', 1, 'Two'],
                    ['"', 2, ''],
                    ['"', -1, '']
            ]

            enclosureWithNum.each { r ->

                assert s.takeBetween(r[0], r[1]).toString() == r[2]
                assert s.takeBetween("${r[0]}", r[1]).toString() == r[2]

                if (r[0] && r[1]) {
                    assert s.takeBetween(CharBuffer.wrap(r[0]), r[1]).toString() == r[2]
                    assert s.takeBetween(new StringBuffer(r[0]), r[1]).toString() == r[2]
                    assert s.takeBetween(new StringBuilder(r[0]), r[1]).toString() == r[2]
                }
            }
        }

        assert 'smalltext'.takeBetween('somelargertextfrom', 'somelargertextto') == ''
        assert 'smalltext'.takeBetween('somelargertextfrom', 'somelargertextto', 0) == ''

        def text2 = "name = 'some name'"

        assert text2.takeBetween("'") == 'some name'
        assert text2.takeBetween('z') == ''

        def text3 = "t1=10 ms, t2=100 ms"

        assert text3.takeBetween('=', ' ', 0) == '10'
        assert text3.takeBetween('=', ' ', 1) == '100'
        assert text3.takeBetween('t1', 'z') == ''

        assert 'one\ntwo\nthree'.takeBetween('\n') == 'two'
    }

    void testCharSequenceStartsWithIgnoreCase() {
        def text = 'Some Text'

        def data = [text,      // String
                    "${text}", // GString
                    java.nio.CharBuffer.wrap(text),
                    new StringBuffer(text),
                    new StringBuilder(text)]

        List<List<Object>> searchStringsAndResults = [

                ['SOME', true],
                ['some', true],
                ['Some', true],
                ['Wrong', false],
                ['Some larger String than self', false],
                ['', false],
                [null, false]
        ]

        data.each { s ->

            searchStringsAndResults.each { r ->

                assert s.startsWithIgnoreCase(r[0]) == r[1]
                assert s.startsWithIgnoreCase("${r[0]}") == r[1]

                if (r[0]) {
                    assert s.startsWithIgnoreCase(CharBuffer.wrap(r[0])) == r[1]
                    assert s.startsWithIgnoreCase(new StringBuffer(r[0])) == r[1]
                    assert s.startsWithIgnoreCase(new StringBuilder(r[0])) == r[1]
                }
            }
        }
    }

    void testCharSequenceEndsWithIgnoreCase() {
        def text = 'Some Text'

        def data = [text,      // String
                    "${text}", // GString
                    java.nio.CharBuffer.wrap(text),
                    new StringBuffer(text),
                    new StringBuilder(text)]

        List<List<Object>> searchStringsAndResults = [

                ['TEXT', true],
                ['text', true],
                ['Text', true],
                ['Wrong', false],
                ['Some larger String than self', false],
                ['', false],
                [null, false]
        ]

        data.each { s ->

            searchStringsAndResults.each { r ->

                assert s.endsWithIgnoreCase(r[0]) == r[1]
                assert s.endsWithIgnoreCase("${r[0]}") == r[1]

                if (r[0]) {
                    assert s.endsWithIgnoreCase(CharBuffer.wrap(r[0])) == r[1]
                    assert s.endsWithIgnoreCase(new StringBuffer(r[0])) == r[1]
                    assert s.endsWithIgnoreCase(new StringBuilder(r[0])) == r[1]
                }
            }
        }
    }

    void testCharSequenceContainsIgnoreCase() {
        def text = 'Some Text'

        def data = [text,      // String
                    "${text}", // GString
                    java.nio.CharBuffer.wrap(text),
                    new StringBuffer(text),
                    new StringBuilder(text)]

        List<List<Object>> searchStringsAndResults = [

                ['E TEX', true],
                ['Me t', true],
                ['me T', true],
                ['Wrong', false],
                ['Some larger String than self', false],
                ['', false],
                [null, false]
        ]

        data.each { s ->

            searchStringsAndResults.each { r ->

                assert s.containsIgnoreCase(r[0]) == r[1]
                assert s.containsIgnoreCase("${r[0]}") == r[1]

                if (r[0]) {
                    assert s.containsIgnoreCase(CharBuffer.wrap(r[0])) == r[1]
                    assert s.containsIgnoreCase(new StringBuffer(r[0])) == r[1]
                    assert s.containsIgnoreCase(new StringBuilder(r[0])) == r[1]
                }
            }
        }
    }
}

class WackyList extends LinkedList {
    WackyList(list) {super(list)}
    WackyList() {this([])}
}

class WackyHashCode {
    int hashCode() {return 1;}
}

class Things implements Iterable<String> {
    Iterator iterator() {
        ["a", "B", "c"].iterator()
    }
}

class ExplodingList extends ArrayList {
    final int num

    ExplodingList(List orig, int num) {
        super(orig)
        this.num = num
    }

    def get(int index) {
        if (index == num) {
            throw new RuntimeException("Explode!")
        }
        super.get(index)
    }

    Iterator iterator() {
        int cursor = 0
        new Iterator() {
            boolean hasNext() { cursor < ExplodingList.this.size() }
            def next() { ExplodingList.this.get(cursor++) }
            void remove() {}
        }
    }
}

enum Suit { HEARTS, CLUBS, SPADES, DIAMONDS }
