/******************************************************************************* * Copyright (c) 2009, 2013 EclipseSource. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Ralf Sternberg - initial API and implementation ******************************************************************************/ package org.eclipse.rap.json; import static org.eclipse.rap.json.TestUtil.assertException; import static org.eclipse.rap.json.TestUtil.serializeAndDeserialize; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.same; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import java.io.IOException; import java.io.StringReader; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; import org.junit.Before; import org.junit.Test; public class JsonArray_Test { private JsonArray array; @Before public void setUp() { array = new JsonArray(); } @Test public void copyConstructor_failsWithNull() { assertException( NullPointerException.class, "array is null", new Runnable() { public void run() { new JsonArray( null ); } } ); } @Test public void copyConstructor_hasSameValues() { array.add( 23 ); JsonArray copy = new JsonArray( array ); assertEquals( array.values(), copy.values() ); } @Test public void copyConstructor_worksOnSafeCopy() { JsonArray copy = new JsonArray( array ); array.add( 23 ); assertTrue( copy.isEmpty() ); } @Test public void unmodifiableArray_hasSameValues() { array.add( 23 ); JsonArray unmodifiableArray = JsonArray.unmodifiableArray( array ); assertEquals( array.values(), unmodifiableArray.values() ); } @Test public void unmodifiableArray_reflectsChanges() { JsonArray unmodifiableArray = JsonArray.unmodifiableArray( array ); array.add( 23 ); assertEquals( array.values(), unmodifiableArray.values() ); } @Test( expected = UnsupportedOperationException.class ) public void unmodifiableArray_preventsModification() { JsonArray unmodifiableArray = JsonArray.unmodifiableArray( array ); unmodifiableArray.add( 23 ); } @Test public void readFrom_reader() throws IOException { assertEquals( new JsonArray(), JsonArray.readFrom( new StringReader( "[]" ) ) ); assertEquals( new JsonArray().add( "a" ).add( 23 ), JsonArray.readFrom( new StringReader( "[ \"a\", 23 ]" ) ) ); } @Test public void readFrom_string() { assertEquals( new JsonArray(), JsonArray.readFrom( "[]" ) ); assertEquals( new JsonArray().add( "a" ).add( 23 ), JsonArray.readFrom( "[ \"a\", 23 ]" ) ); } @Test public void isEmpty_isTrueAfterCreation() { assertTrue( array.isEmpty() ); } @Test public void isEmpty_isFalseAfterAdd() { array.add( true ); assertFalse( array.isEmpty() ); } @Test public void size_isZeroAfterCreation() { assertEquals( 0, array.size() ); } @Test public void size_isOneAfterAdd() { array.add( true ); assertEquals( 1, array.size() ); } @Test public void iterator_isEmptyAfterCreation() { assertFalse( array.iterator().hasNext() ); } @Test public void iterator_hasNextAfterAdd() { array.add( true ); Iterator<JsonValue> iterator = array.iterator(); assertTrue( iterator.hasNext() ); assertEquals( JsonValue.TRUE, iterator.next() ); assertFalse( iterator.hasNext() ); } @Test( expected = UnsupportedOperationException.class ) public void iterator_doesNotAllowModification() { array.add( 23 ); Iterator<JsonValue> iterator = array.iterator(); iterator.next(); iterator.remove(); } @Test( expected = ConcurrentModificationException.class ) public void iterator_detectsConcurrentModification() { Iterator<JsonValue> iterator = array.iterator(); array.add( 23 ); iterator.next(); } @Test public void values_isEmptyAfterCreation() { assertTrue( array.values().isEmpty() ); } @Test public void values_containsValueAfterAdd() { array.add( true ); assertEquals( 1, array.values().size() ); assertEquals( JsonValue.TRUE, array.values().get( 0 ) ); } @Test public void values_reflectsChanges() { List<JsonValue> values = array.values(); array.add( true ); assertEquals( array.values(), values ); } @Test( expected = UnsupportedOperationException.class ) public void values_preventsModification() { List<JsonValue> values = array.values(); values.add( JsonValue.TRUE ); } @Test public void get_returnsValue() { array.add( 23 ); JsonValue value = array.get( 0 ); assertEquals( JsonValue.valueOf( 23 ), value ); } @Test( expected = IndexOutOfBoundsException.class ) public void get_failsWithInvalidIndex() { array.get( 0 ); } @Test public void add_int() { array.add( 23 ); assertEquals( "[23]", array.toString() ); } @Test public void add_int_enablesChaining() { assertSame( array, array.add( 23 ) ); } @Test public void add_long() { array.add( 23l ); assertEquals( "[23]", array.toString() ); } @Test public void add_long_enablesChaining() { assertSame( array, array.add( 23l ) ); } @Test public void add_float() { array.add( 3.14f ); assertEquals( "[3.14]", array.toString() ); } @Test public void add_float_enablesChaining() { assertSame( array, array.add( 3.14f ) ); } @Test public void add_double() { array.add( 3.14d ); assertEquals( "[3.14]", array.toString() ); } @Test public void add_double_enablesChaining() { assertSame( array, array.add( 3.14d ) ); } @Test public void add_boolean() { array.add( true ); assertEquals( "[true]", array.toString() ); } @Test public void add_boolean_enablesChaining() { assertSame( array, array.add( true ) ); } @Test public void add_string() { array.add( "foo" ); assertEquals( "[\"foo\"]", array.toString() ); } @Test public void add_string_enablesChaining() { assertSame( array, array.add( "foo" ) ); } @Test public void add_string_toleratesNull() { array.add( (String)null ); assertEquals( "[null]", array.toString() ); } @Test public void add_jsonNull() { array.add( JsonValue.NULL ); assertEquals( "[null]", array.toString() ); } @Test public void add_jsonArray() { array.add( new JsonArray() ); assertEquals( "[[]]", array.toString() ); } @Test public void add_jsonObject() { array.add( new JsonObject() ); assertEquals( "[{}]", array.toString() ); } @Test public void add_json_enablesChaining() { assertSame( array, array.add( JsonValue.NULL ) ); } @Test( expected = NullPointerException.class ) public void add_json_failsWithNull() { array.add( (JsonValue)null ); } @Test public void add_json_nestedArray() { JsonArray innerArray = new JsonArray(); innerArray.add( 23 ); array.add( innerArray ); assertEquals( "[[23]]", array.toString() ); } @Test public void add_json_nestedArray_modifiedAfterAdd() { JsonArray innerArray = new JsonArray(); array.add( innerArray ); innerArray.add( 23 ); assertEquals( "[[23]]", array.toString() ); } @Test public void add_json_nestedObject() { JsonObject innerObject = new JsonObject(); innerObject.add( "a", 23 ); array.add( innerObject ); assertEquals( "[{\"a\":23}]", array.toString() ); } @Test public void add_json_nestedObject_modifiedAfterAdd() { JsonObject innerObject = new JsonObject(); array.add( innerObject ); innerObject.add( "a", 23 ); assertEquals( "[{\"a\":23}]", array.toString() ); } @Test public void set_int() { array.add( false ); array.set( 0, 23 ); assertEquals( "[23]", array.toString() ); } @Test public void set_int_enablesChaining() { array.add( false ); assertSame( array, array.set( 0, 23 ) ); } @Test public void set_long() { array.add( false ); array.set( 0, 23l ); assertEquals( "[23]", array.toString() ); } @Test public void set_long_enablesChaining() { array.add( false ); assertSame( array, array.set( 0, 23l ) ); } @Test public void set_float() { array.add( false ); array.set( 0, 3.14f ); assertEquals( "[3.14]", array.toString() ); } @Test public void set_float_enablesChaining() { array.add( false ); assertSame( array, array.set( 0, 3.14f ) ); } @Test public void set_double() { array.add( false ); array.set( 0, 3.14d ); assertEquals( "[3.14]", array.toString() ); } @Test public void set_double_enablesChaining() { array.add( false ); assertSame( array, array.set( 0, 3.14d ) ); } @Test public void set_boolean() { array.add( false ); array.set( 0, true ); assertEquals( "[true]", array.toString() ); } @Test public void set_boolean_enablesChaining() { array.add( false ); assertSame( array, array.set( 0, true ) ); } @Test public void set_string() { array.add( false ); array.set( 0, "foo" ); assertEquals( "[\"foo\"]", array.toString() ); } @Test public void set_string_enablesChaining() { array.add( false ); assertSame( array, array.set( 0, "foo" ) ); } @Test public void set_jsonNull() { array.add( false ); array.set( 0, JsonValue.NULL ); assertEquals( "[null]", array.toString() ); } @Test public void set_jsonArray() { array.add( false ); array.set( 0, new JsonArray() ); assertEquals( "[[]]", array.toString() ); } @Test public void set_jsonObject() { array.add( false ); array.set( 0, new JsonObject() ); assertEquals( "[{}]", array.toString() ); } @Test( expected = NullPointerException.class ) public void set_json_failsWithNull() { array.add( false ); array.set( 0, (JsonValue)null ); } @Test( expected = IndexOutOfBoundsException.class ) public void set_json_failsWithInvalidIndex() { array.set( 0, JsonValue.NULL ); } @Test public void set_json_enablesChaining() { array.add( false ); assertSame( array, array.set( 0, JsonValue.NULL ) ); } @Test public void set_json_replacesDifferntArrayElements() { array.add( 3 ).add( 6 ).add( 9 ); array.set( 1, 4 ).set( 2, 5 ); assertEquals( "[3,4,5]", array.toString() ); } @Test public void write_delegatesToJsonWriter() throws IOException { JsonWriter writer = mock( JsonWriter.class ); array.write( writer ); verify( writer ).writeArray( same( array ) ); } @Test public void isArray() { assertTrue( array.isArray() ); } @Test public void asArray() { assertSame( array, array.asArray() ); } @Test public void equals_trueForSameInstance() { assertTrue( array.equals( array ) ); } @Test public void equals_trueForEqualArrays() { assertTrue( array().equals( array() ) ); assertTrue( array( "foo", "bar" ).equals( array( "foo", "bar" ) ) ); } @Test public void equals_falseForDifferentArrays() { assertFalse( array( "foo", "bar" ).equals( array( "foo", "bar", "baz" ) ) ); assertFalse( array( "foo", "bar" ).equals( array( "bar", "foo" ) ) ); } @Test public void equals_falseForNull() { assertFalse( array.equals( null ) ); } @Test public void equals_falseForSubclass() { assertFalse( array.equals( new JsonArray( array ) {} ) ); } @Test public void hashCode_equalsForEqualArrays() { assertTrue( array().hashCode() == array().hashCode() ); assertTrue( array( "foo" ).hashCode() == array( "foo" ).hashCode() ); } @Test public void hashCode_differsForDifferentArrays() { assertFalse( array().hashCode() == array( "bar" ).hashCode() ); assertFalse( array( "foo" ).hashCode() == array( "bar" ).hashCode() ); } @Test public void canBeSerializedAndDeserialized() throws Exception { array.add( true ).add( 3.14d ).add( 23 ).add( "foo" ).add( new JsonArray().add( false ) ); assertEquals( array, serializeAndDeserialize( array ) ); } @Test public void deserializedArrayCanBeAccessed() throws Exception { array.add( 23 ); JsonArray deserializedArray = serializeAndDeserialize( array ); assertEquals( 23, deserializedArray.get( 0 ).asInt() ); } private static JsonArray array( String... values ) { JsonArray array = new JsonArray(); for( String value : values ) { array.add( value ); } return array; } }