@Test public void testParseTopValues() { Map<String, Object> tests = new HashMap<>(); tests.put("\"a-string\"", "a-string"); tests.put("true", true); tests.put("false", false); tests.put("1234", 1234L); tests.put("" + Long.MAX_VALUE, Long.MAX_VALUE); tests.forEach((test, expected) -> { JsonParser parser = JsonParser.newParser(); List<Object> values = new ArrayList<>(); parser.handler(event -> values.add(event.value())); parser.handle(Buffer.buffer(test)); parser.end(); assertEquals(Collections.singletonList(expected), values); }); }
@Test public void parseUnfinished() { Buffer data = Buffer.buffer("{\"un\":\"finished\""); try { JsonParser parser = JsonParser.newParser(); parser.handle(data); parser.end(); fail(); } catch (DecodeException expected) { } JsonParser parser = JsonParser.newParser(); List<Throwable> errors = new ArrayList<>(); parser.exceptionHandler(errors::add); parser.handle(data); parser.end(); assertEquals(1, errors.size()); }
@Test public void testObjectMapping() { JsonParser parser = JsonParser.newParser(); List<Object> values = new ArrayList<>(); parser.objectValueMode(); parser.handler(event -> values.add(event.mapTo(TheObject.class))); parser.handle(new JsonObject().put("f", "the-value").toBuffer()); assertEquals(Collections.singletonList(new TheObject("the-value")), values); }
@Override public WriteStream<Buffer> write(Buffer buffer) { parser.handle(buffer); return this; }
@Test public void testObjectMappingWithTypeReference() { JsonParser parser = JsonParser.newParser(); List<Object> values = new ArrayList<>(); parser.objectValueMode(); parser.handler(event -> values.add(event.mapTo(new TypeReference<TheObject>() {}))); parser.handle(new JsonObject().put("f", "the-value").toBuffer()); assertEquals(Collections.singletonList(new TheObject("the-value")), values); }
@Test public void testArrayMapping() { JsonParser parser = JsonParser.newParser(); List<Object> values = new ArrayList<>(); parser.arrayValueMode(); parser.handler(event -> values.add(event.mapTo(LinkedList.class))); parser.handle(new JsonArray().add(0).add(1).add(2).toBuffer()); assertEquals(Collections.singletonList(Arrays.asList(0L, 1L, 2L)), values); assertEquals(LinkedList.class, values.get(0).getClass()); }
@Test public void testParseConcatedJSONStream() { JsonParser parser = JsonParser.newParser(); AtomicInteger startCount = new AtomicInteger(); AtomicInteger endCount = new AtomicInteger(); parser.handler(event -> { switch (event.type()) { case START_OBJECT: startCount.incrementAndGet(); break; case END_OBJECT: endCount.incrementAndGet(); break; default: fail(); break; } }); parser.handle(Buffer.buffer("{}{}")); assertEquals(2, startCount.get()); assertEquals(2, endCount.get()); }
@Test public void testArrayMappingWithTypeReference() { JsonParser parser = JsonParser.newParser(); List<Object> values = new ArrayList<>(); parser.arrayValueMode(); parser.handler(event -> values.add(event.mapTo(new TypeReference<LinkedList<Long>>() {}))); parser.handle(new JsonArray().add(0).add(1).add(2).toBuffer()); assertEquals(Collections.singletonList(Arrays.asList(0L, 1L, 2L)), values); assertEquals(LinkedList.class, values.get(0).getClass()); }
@Test public void testObjectHandlerScope() { JsonParser parser = JsonParser.newParser(); List<JsonObject> objects = new ArrayList<>(); AtomicInteger ends = new AtomicInteger(); AtomicBoolean obj = new AtomicBoolean(); parser.handler(event -> { switch (event.type()) { case START_OBJECT: parser.objectValueMode(); break; case VALUE: if (obj.get()) { objects.add((JsonObject) event.value()); } break; case END_OBJECT: ends.incrementAndGet(); obj.set(true); break; } }); parser.handle(Buffer.buffer("[" + "{\"one\":1}," + "{\"two\":2}," + "{\"three\":3}" + "]")); assertEquals(1, ends.get()); assertEquals(Arrays.asList(new JsonObject().put("two", 2), new JsonObject().put("three", 3)), objects); }
@Test public void testParseObjectValue() { JsonParser parser = JsonParser.newParser(); AtomicInteger status = new AtomicInteger(); parser.objectValueMode(); JsonObject expected = new JsonObject() .put("number", 3) .put("floating", 3.5d) .put("true", true) .put("false", false) .put("string", "s") .put("object", new JsonObject().put("foo", "bar")) .put("array", new JsonArray().add(0).add(1).add(2)) .putNull("null") .put("bytes", new byte[]{1, 2, 3}); parser.handler(event -> { assertEquals(0, status.getAndIncrement()); assertEquals(JsonEventType.VALUE, event.type()); assertEquals(expected, event.value()); }); parser.handle(expected.toBuffer()); assertEquals(1, status.get()); }
parser.handle(Buffer.buffer("{}\r\n1\r\nnull\r\n\"foo\"")); assertEquals(1, startCount.get()); assertEquals(1, endCount.get());
@Test public void testParseEmptyArray() { JsonParser parser = JsonParser.newParser(); AtomicInteger status = new AtomicInteger(); parser.handler(event -> { assertNull(event.fieldName()); assertNull(event.value()); switch (status.getAndIncrement()) { case 0: assertEquals(JsonEventType.START_ARRAY, event.type()); break; case 1: assertEquals(JsonEventType.END_ARRAY, event.type()); break; default: fail(); } }); parser.handle(Buffer.buffer("[]")); assertEquals(2, status.get()); }
AtomicInteger count = new AtomicInteger(); parser.endHandler(v -> count.incrementAndGet()); parser.handle(Buffer.buffer("{}")); assertEquals(2, status.get()); assertEquals(0, count.get());
@Test public void testParseArrayValue() { JsonParser parser = JsonParser.newParser(); AtomicInteger status = new AtomicInteger(); parser.arrayValueMode(); JsonArray expected = new JsonArray() .add(3) .add(3.5d) .add(true) .add(false) .add("s") .addNull() .add(new JsonObject().put("foo", "bar")) .add(new JsonArray().add(0).add(1).add(2)) .add(new byte[]{1, 2, 3}); parser.handler(event -> { assertEquals(expected, event.value()); assertEquals(0, status.getAndIncrement()); }); parser.handle(expected.toBuffer()); assertEquals(1, status.get()); }
private void testValue(String jsonValue, Handler<JsonEvent> checker) { JsonParser parser = JsonParser.newParser(); AtomicInteger status = new AtomicInteger(); parser.handler(event -> { switch (status.getAndIncrement()) { case 0: assertEquals(JsonEventType.START_OBJECT, event.type()); assertNull(event.fieldName()); assertNull(event.value()); break; case 1: assertEquals(JsonEventType.VALUE, event.type()); checker.handle(event); assertEquals("foo", event.fieldName()); break; case 2: assertEquals(JsonEventType.END_OBJECT, event.type()); assertNull(event.fieldName()); assertNull(event.value()); break; } }); parser.handle(Buffer.buffer("{\"foo\":" + jsonValue + "}")); assertEquals(3, status.get()); }
parser.handle(Buffer.buffer("[" + "{\"one\":1}," + "{\"two\":2}," +
parser.handle(Buffer.buffer("{\"foo\":{},\"bar\":{}}")); assertEquals(4, status.get());
@Test public void testObjectMappingWithTypeReference() { JsonParser parser = JsonParser.newParser(); List<Object> values = new ArrayList<>(); parser.objectValueMode(); parser.handler(event -> values.add(event.mapTo(new TypeReference<TheObject>() {}))); parser.handle(new JsonObject().put("f", "the-value").toBuffer()); assertEquals(Collections.singletonList(new TheObject("the-value")), values); }
@Test public void testObjectMapping() { JsonParser parser = JsonParser.newParser(); List<Object> values = new ArrayList<>(); parser.objectValueMode(); parser.handler(event -> values.add(event.mapTo(TheObject.class))); parser.handle(new JsonObject().put("f", "the-value").toBuffer()); assertEquals(Collections.singletonList(new TheObject("the-value")), values); }
@Test public void testArrayMappingWithTypeReference() { JsonParser parser = JsonParser.newParser(); List<Object> values = new ArrayList<>(); parser.arrayValueMode(); parser.handler(event -> values.add(event.mapTo(new TypeReference<LinkedList<Long>>() {}))); parser.handle(new JsonArray().add(0).add(1).add(2).toBuffer()); assertEquals(Collections.singletonList(Arrays.asList(0L, 1L, 2L)), values); assertEquals(LinkedList.class, values.get(0).getClass()); }