/* * Copyright 2011 Google Inc. * * Licensed 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 com.google.api.explorer.client.base.dynamicjso; import com.google.api.explorer.client.base.BaseGwtTest; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsonUtils; /** * Tests for {@link DynamicJsArray}s. * * @author jasonhall@google.com (Jason Hall) */ public class DynamicJsArrayGwtTest extends BaseGwtTest { /** Values stored in JSON strings are accessible through the JSO. */ public void testDynamicJsArray_getters() { DynamicJsArray arr = JsonUtils.safeEval("[\"a\"]"); assertEquals("a", arr.getString(0)); assertEquals(JsType.STRING, arr.typeofIndex(0)); arr = JsonUtils.safeEval("[42]"); assertEquals(42, arr.getInteger(0)); assertEquals(JsType.INTEGER, arr.typeofIndex(0)); arr = JsonUtils.safeEval("[1.2]"); assertEquals(1.2, arr.getDouble(0)); assertEquals(JsType.NUMBER, arr.typeofIndex(0)); arr = JsonUtils.safeEval("[false]"); assertFalse(arr.getBoolean(0)); assertEquals(JsType.BOOLEAN, arr.typeofIndex(0)); arr = JsonUtils.safeEval("[[1,2,3]]"); assertEquals(1, arr.length()); DynamicJsArray inner = arr.get(0); assertEquals(1, inner.getInteger(0)); assertEquals(2, inner.getInteger(1)); assertEquals(3, inner.getInteger(2)); assertEquals(JsType.ARRAY, arr.typeofIndex(0)); arr = JsonUtils.safeEval("[{\"foo\":\"bar\"}]"); assertEquals("bar", arr.<DynamicJso>get(0).getString("foo")); assertEquals(JsType.OBJECT, arr.typeofIndex(0)); } /** Array of keys is accessible through the JSO. */ public void testDynamicJsArray_length() { DynamicJsArray arr = JsonUtils.safeEval("[1, \"a\", false]"); assertEquals(3, arr.length()); // Length can be increased arbitrarily, but items default to null. arr.setLength(6); assertEquals(6, arr.length()); assertNull(arr.get(3)); // Getting a non-existent element returns null. assertNull(arr.get(10)); assertNull(arr.typeofIndex(10)); // Array can be shortened, trimming items from the end. arr.setLength(1); assertEquals(1, arr.length()); assertEquals(1, arr.getInteger(0)); assertNull(arr.get(1)); } /** Data can be set on the array and retrieved as expected. */ public void testDynamicJsArray_setters() { DynamicJsArray arr = JavaScriptObject.createArray().cast(); assertEquals(0, arr.length()); arr.set(0, "b"); assertEquals("b", arr.getString(0)); assertEquals(1, arr.length()); arr.set(1, false); assertFalse(arr.getBoolean(1)); arr.set(2, 12); assertEquals(12, arr.getInteger(2)); arr.set(3, 2.1); assertEquals(2.1, arr.getDouble(3)); arr.set(4, JavaScriptObject.createObject().cast()); assertEquals(0, arr.<DynamicJso>get(4).keys().length()); // All these setters have added to the length. assertEquals(5, arr.length()); } /** shift() pops a value off the beginning of the array. */ public void testDynamicJsArray_shift() { DynamicJsArray arr = JsonUtils.safeEval("[false, 1.2, 12, \"a\", {\"a\":\"b\"}]"); assertEquals(5, arr.length()); assertFalse(arr.shiftBoolean()); assertEquals(4, arr.length()); assertEquals(1.2, arr.shiftDouble()); assertEquals(3, arr.length()); assertEquals(12, arr.shiftInteger()); assertEquals(2, arr.length()); assertEquals("a", arr.shiftString()); assertEquals(1, arr.length()); DynamicJso jso = arr.shift(); assertEquals(0, arr.length()); assertEquals(1, jso.keys().length()); assertEquals("b", jso.getString("a")); // With nothing remaining, shift() returns null. assertNull(arr.shift()); } /** unshift() adds the value to the beginning of the array. */ public void testDynamicJsArray_unshift() { DynamicJsArray arr = JavaScriptObject.createArray().cast(); assertEquals(0, arr.length()); arr.unshift(true); assertTrue(arr.getBoolean(0)); assertEquals(1, arr.length()); arr.unshift(1.2); assertEquals(1.2, arr.getDouble(0)); assertEquals(2, arr.length()); arr.unshift(12); assertEquals(12, arr.getInteger(0)); assertEquals(3, arr.length()); arr.unshift("b"); assertEquals("b", arr.getString(0)); assertEquals(4, arr.length()); JavaScriptObject obj = JavaScriptObject.createObject(); arr.unshift(obj); assertEquals(obj, arr.get(0)); assertEquals(5, arr.length()); } /** * Calls to push() add the value to the end of the array, lengthening it as it * goes. */ public void testDynamicJsArray_push() { DynamicJsArray arr = JavaScriptObject.createArray().cast(); assertEquals(0, arr.length()); arr.push(true); assertTrue(arr.getBoolean(0)); assertEquals(1, arr.length()); arr.push(1.2); assertEquals(1.2, arr.getDouble(1)); assertEquals(2, arr.length()); arr.push(12); assertEquals(12, arr.getInteger(2)); assertEquals(3, arr.length()); arr.push("b"); assertEquals("b", arr.getString(3)); assertEquals(4, arr.length()); JavaScriptObject obj = JavaScriptObject.createObject(); arr.push(obj); assertEquals(obj, arr.get(4)); assertEquals(5, arr.length()); } /** The type of data stored in the array is accessible as expected. */ public void testDynamicJsArray_typeof() { DynamicJsArray arr = JsonUtils.safeEval("[1.2, 12, \"foo\", false, [\"a\"], {\"fa\":\"bar\"}]"); assertEquals(JsType.NUMBER, arr.typeofIndex(0)); assertEquals(JsType.INTEGER, arr.typeofIndex(1)); assertEquals(JsType.STRING, arr.typeofIndex(2)); assertEquals(JsType.BOOLEAN, arr.typeofIndex(3)); assertEquals(JsType.ARRAY, arr.typeofIndex(4)); assertEquals(JsType.OBJECT, arr.typeofIndex(5)); } }