| /* |
| * Copyright 2010 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.gwt.dev.json; |
| |
| import com.google.gwt.dev.json.JsonArray; |
| import com.google.gwt.dev.json.JsonException; |
| import com.google.gwt.dev.json.JsonObject; |
| import com.google.gwt.dev.json.JsonValue; |
| import com.google.gwt.dev.json.Tokenizer; |
| |
| import junit.framework.TestCase; |
| |
| import java.io.IOException; |
| import java.io.StringReader; |
| |
| /** |
| * Internal tests of {@link Tokenizer}. |
| */ |
| public class TokenizerTest extends TestCase { |
| private static Tokenizer tokenizerFor(String data) { |
| return new Tokenizer(new StringReader(data)); |
| } |
| |
| /** |
| * Tests {@link Tokenizer#back(char)}. |
| * |
| * @throws IOException |
| */ |
| public void testBack() throws IOException { |
| final Tokenizer tokenizer = tokenizerFor("ab c"); |
| assertEquals('a', tokenizer.next()); |
| tokenizer.back('a'); |
| assertEquals('a', tokenizer.next()); |
| assertEquals('b', tokenizer.next()); |
| assertEquals('c', tokenizer.nextNonWhitespace()); |
| tokenizer.back('c'); |
| assertEquals('c', tokenizer.nextNonWhitespace()); |
| } |
| |
| /** |
| * Tests {@link Tokenizer#next()}. |
| * |
| * @throws IOException |
| */ |
| public void testNext() throws IOException { |
| final Tokenizer tokenizer = tokenizerFor("abc"); |
| assertEquals('a', tokenizer.next()); |
| assertEquals('b', tokenizer.next()); |
| assertEquals('c', tokenizer.next()); |
| assertEquals(-1, tokenizer.next()); |
| assertEquals(-1, tokenizer.next()); |
| } |
| |
| /** |
| * Tests {@link Tokenizer#nextNonWhitespace()}. |
| * |
| * @throws IOException |
| */ |
| public void testNextNonWhite() throws IOException { |
| final Tokenizer tokenizer = tokenizerFor(" a\n\tbc "); |
| assertEquals('a', tokenizer.nextNonWhitespace()); |
| assertEquals('b', tokenizer.nextNonWhitespace()); |
| assertEquals('c', tokenizer.nextNonWhitespace()); |
| assertEquals(-1, tokenizer.nextNonWhitespace()); |
| assertEquals(-1, tokenizer.nextNonWhitespace()); |
| } |
| |
| /** |
| * Tests {@link Tokenizer#nextString()}. |
| * |
| * @throws IOException |
| * @throws JsonException |
| */ |
| public void testNextString() throws IOException, JsonException { |
| assertEquals("json json", tokenizerFor("\"json json\"").nextString()); |
| assertEquals("json\n\t\rjson", |
| tokenizerFor("\"json\\n\\t\\rjson\"").nextString()); |
| assertEquals("\u8734", tokenizerFor("\"\\u8734\"").nextString()); |
| } |
| |
| /** |
| * Tests {@link Tokenizer#nextValue()} for array values. |
| * |
| * @throws IOException |
| * @throws JsonException |
| */ |
| public void testNextValueForArrays() throws IOException, JsonException { |
| final JsonValue a = tokenizerFor("[]").nextValue(); |
| assertEquals(0, a.asArray().getLength()); |
| |
| final JsonValue b = tokenizerFor( |
| "[1, 1.76, \"pug butt\", true, false, null, {}, []]").nextValue(); |
| final JsonArray ba = b.asArray(); |
| assertEquals(1, ba.get(0).asNumber().getInteger()); |
| assertEquals(1.76, ba.get(1).asNumber().getDecimal(), 0.001); |
| assertEquals("pug butt", ba.get(2).asString().getString()); |
| assertTrue(ba.get(3).asBoolean().getBoolean()); |
| assertFalse(ba.get(4).asBoolean().getBoolean()); |
| assertEquals(JsonValue.NULL, ba.get(5)); |
| assertTrue(ba.get(6).asObject().isEmpty()); |
| assertEquals(0, ba.get(7).asArray().getLength()); |
| } |
| |
| /** |
| * Tests {@link Tokenizer#nextValue()} for literals. |
| * |
| * @throws IOException |
| * @throws JsonException |
| */ |
| public void testNextValueForLiterals() throws IOException, JsonException { |
| final JsonValue a = tokenizerFor("null").nextValue(); |
| assertEquals(JsonValue.NULL, a); |
| |
| final JsonValue b = tokenizerFor("true").nextValue(); |
| assertTrue(b.asBoolean().getBoolean()); |
| |
| final JsonValue c = tokenizerFor("false").nextValue(); |
| assertFalse(c.asBoolean().getBoolean()); |
| |
| final JsonValue d = tokenizerFor("\"kellegous\u8738\"").nextValue(); |
| assertEquals("kellegous\u8738", d.asString().getString()); |
| |
| final JsonValue e = tokenizerFor("0.2").nextValue(); |
| assertEquals(0.2, e.asNumber().getDecimal(), 0.001); |
| |
| final JsonValue f = tokenizerFor("420").nextValue(); |
| assertEquals(420, f.asNumber().getInteger()); |
| |
| final JsonValue g = tokenizerFor("6.23e-20").nextValue(); |
| assertEquals(6.23e-20, g.asNumber().getDecimal(), 1e-20); |
| |
| boolean didThrow = false; |
| try { |
| tokenizerFor("naked").nextValue(); |
| } catch (JsonException x) { |
| didThrow = true; |
| } |
| assertTrue(didThrow); |
| } |
| |
| /** |
| * Tests {@link Tokenizer#nextValue()} for object values. |
| * |
| * @throws IOException |
| * @throws JsonException |
| */ |
| public void testNextValueForObjects() throws IOException, JsonException { |
| final JsonValue a = tokenizerFor("{}").nextValue(); |
| assertTrue(a.asObject().isEmpty()); |
| |
| final JsonValue b = tokenizerFor("{\"a\" : 1}").nextValue(); |
| assertEquals(1, b.asObject().get("a").asNumber().getInteger()); |
| |
| final JsonValue c = tokenizerFor( |
| "{\"a b\":12.3e10,\"b a\":\"\u8387\",\n\"c\" : null,\"d\":true,\"e\" : false, \"f\":{\n}}").nextValue(); |
| final JsonObject co = c.asObject(); |
| assertNotNull(co); |
| assertEquals(12.3e10, co.get("a b").asNumber().getDecimal(), 0.001); |
| assertEquals("\u8387", co.get("b a").asString().getString()); |
| assertEquals(JsonValue.NULL, co.get("c")); |
| assertTrue(co.get("d").asBoolean().getBoolean()); |
| assertFalse(co.get("e").asBoolean().getBoolean()); |
| assertTrue(co.get("f").asObject().isEmpty()); |
| } |
| } |