blob: 7cbab1b3309546c3069c5accf45f8852cb3cc6ca [file] [log] [blame]
package json.specs
import org.apache.tapestry5.json.JSONArray
import spock.lang.Specification
class JSONArraySpec extends Specification {
def "can create a JSONArray by parsing a JSON string"() {
when:
def array = new JSONArray(/[ 'foo', 'bar', "baz" ]/)
then:
array.length() == 3
array.get(0) == "foo"
array.get(1) == "bar"
array.get(2) == "baz"
}
def "create a JSONArray from varags"() {
when:
def array = new JSONArray("fred", "barney", "wilma")
then:
array.length() == 3
array.toCompactString() == /["fred","barney","wilma"]/
}
def "array must start with a bracket"() {
when:
new JSONArray("1, 2, 3]")
then:
RuntimeException e = thrown()
e.message == "A JSONArray text must start with '[' at character 1 of 1, 2, 3]"
}
def "parse an empty array"() {
when:
def array = new JSONArray("[]")
then:
array.length() == 0
}
def "an empty element in the parse is a null"() {
when:
def array = new JSONArray("[1,,3]")
then:
array.length() == 3
array.getInt(0) == 1
array.isNull(1)
array.getInt(2) == 3
}
def "a comma at the end of the list is ignored"() {
when:
def array = new JSONArray("[1,2,]")
then:
array.length() == 2
array.get(0) == 1
array.get(1) == 2
}
def "getBoolean() when not a boolean at index is an exception"() {
def array = new JSONArray("[123]")
when:
array.getBoolean(0)
then:
RuntimeException e = thrown()
e.message == "JSONArray[0] is not a Boolean."
}
def "handling of boolean values passed into constructor"() {
when:
def array = new JSONArray(true, false, "True", "False")
then:
array.getBoolean(0) == true
array.getBoolean(1) == false
array.getBoolean(2) == true
array.getBoolean(3) == false
}
def "getDouble() when not a double at index is an exception"() {
def array = new JSONArray(true)
when:
array.getDouble(0)
then:
RuntimeException e = thrown()
e.message == "JSONArray[0] is not a number."
}
def "getDouble() works with numbers and parseable strings"() {
def array = new JSONArray(400l, "95.5")
expect:
array.getDouble(0) == 400d
array.getDouble(1) == 95.5d
}
def "getLong() works with numbers and parseable strings"() {
def array = new JSONArray(400l, "95.5")
expect:
array.getLong(0) == 400l
array.getLong(1) == 95l
}
def "getJSONArray() when not an array at index is exception"() {
def array = new JSONArray("fred", "barney")
when:
array.getJSONArray(1)
then:
RuntimeException e = thrown()
e.message == "JSONArray[1] is not a JSONArray."
}
def "get a nested array"() {
def nested = new JSONArray()
def outer = new JSONArray(nested)
expect:
outer.getJSONArray(0).is(nested)
}
def "getJSONObject() when not a JSONObject at index is an exception"() {
def array = new JSONArray("fred", "barney", "wilma")
when:
array.getJSONObject(1)
then:
RuntimeException e = thrown()
e.message == "JSONArray[1] is not a JSONObject."
}
def "may not put at a negative index"() {
def array = new JSONArray()
when:
array.put(-1, "fred")
then:
RuntimeException e = thrown()
e.message == "JSONArray[-1] not found."
}
def "put() overrides existing value in array"() {
def array = new JSONArray("fred", "barney", "wilma")
when:
array.put 2, "betty"
then:
array.get(2) == "betty"
}
def "put() with index past end pads array with nulls"() {
def array = new JSONArray("fred", "barney", "wilma")
when:
array.put 4, "bambam"
then:
array.isNull(3)
array.toCompactString() == /["fred","barney","wilma",null,"bambam"]/
}
def "array equality"() {
when:
def array1 = new JSONArray(1, 2, 3)
def array2 = new JSONArray(1, 2, 3)
then:
array1 == array1
!array1.equals(null)
array1 != this
array1 == array2
when:
array2.put 9, "stuff"
then:
array1 != array2
}
def "pretty print"() {
def array = new JSONArray("fred", "barney")
expect:
array.toString() == '''[
"fred",
"barney"
]'''
}
def "JSONArray is Iterable"() {
def array = new JSONArray(1, 2, false)
when:
def i = array.iterator()
then:
i.next() == 1
i.next() == 2
i.next() == false
!i.hasNext()
}
def "remove an element"() {
def array = new JSONArray("one", "two", "three")
when:
array.remove(1)
then:
array.length() == 2
array.toCompactString() == /["one","three"]/
}
def "putAll() adds new objects to existing array"() {
def array = new JSONArray(100, 200)
when:
array.putAll([300, 400, 500])
then:
array.toCompactString() == /[100,200,300,400,500]/
}
def "putAll() with null does not modify the array"() {
def array = new JSONArray(100, 200)
when:
array.putAll(null)
then:
array.toCompactString() == /[100,200]/
}
def "list returned by toList() is unmodifiable"() {
def array = new JSONArray(100, 200)
def list = array.toList()
when:
list.clear()
then:
thrown(UnsupportedOperationException)
}
def "list from toList() is live"() {
def array = new JSONArray(100, 200)
when:
def list = array.toList()
then:
list == [100, 200]
when:
array.remove(0)
then:
list == [200]
}
def "can initialize JSONObject from an Iterable"() {
when:
def list = JSONArray.from([1, 2, 3])
then:
list.toString(true) == "[1,2,3]"
}
def "put() should throw an IllegalArgumentException when receiving null"() {
def array = new JSONArray()
when:
array.put(null)
then:
thrown IllegalArgumentException
}
def "new JSONArray() should throw an IllegalArgumentException when receiving null"() {
when:
new JSONArray(1, null, 3)
then:
thrown IllegalArgumentException
}
}