@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 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 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 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 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 parseNumberFormatException() { Buffer data = Buffer.buffer(Long.MAX_VALUE + "0"); try { JsonParser.newParser().handler(val -> {}).write(data).end(); fail(); } catch (DecodeException expected) { } List<Throwable> errors = new ArrayList<>(); JsonParser.newParser().exceptionHandler(errors::add).handler(val -> {}).write(data).end(); assertEquals(1, errors.size()); }
@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 testArrayMappingError() { List<Object> values = new ArrayList<>(); List<Throwable> errors = new ArrayList<>(); JsonParser.newParser().arrayValueMode().handler(event -> values.add(event.mapTo(TheObject.class))).exceptionHandler(errors::add).write(Buffer.buffer("[]")).end(); assertEquals(Collections.emptyList(), values); assertEquals(1, errors.size()); try { JsonParser.newParser().arrayValueMode().handler(event -> values.add(event.mapTo(TheObject.class))).write(Buffer.buffer("[]")).end(); fail(); } catch (DecodeException expected) { } assertEquals(Collections.emptyList(), values); assertEquals(1, errors.size()); }
@Test public void testObjectMappingError() { List<Object> values = new ArrayList<>(); List<Throwable> errors = new ArrayList<>(); JsonParser.newParser().objectValueMode().handler(event -> values.add(event.mapTo(TheObject.class))).exceptionHandler(errors::add).write(Buffer.buffer("{\"destination\":\"unknown\"}")).end(); assertEquals(Collections.emptyList(), values); assertEquals(1, errors.size()); try { JsonParser.newParser().objectValueMode().handler(event -> values.add(event.mapTo(TheObject.class))).write(Buffer.buffer("{\"destination\":\"unknown\"}")).end(); fail(); } catch (DecodeException expected) { } assertEquals(Collections.emptyList(), values); assertEquals(1, errors.size()); }
@Test public void testStreamHandle() { FakeStream stream = new FakeStream(); JsonParser parser = JsonParser.newParser(stream); List<JsonEvent> events = new ArrayList<>(); parser.handler(events::add); stream.handle("{}"); assertFalse(stream.isPaused()); assertEquals(2, events.size()); }
@Test public void testStreamPauseInHandler() { FakeStream stream = new FakeStream(); JsonParser parser = JsonParser.newParser(stream); List<JsonEvent> events = new ArrayList<>(); parser.handler(event -> { assertTrue(events.isEmpty()); events.add(event); parser.pause(); }); stream.handle("{}"); assertEquals(1, events.size()); assertTrue(stream.isPaused()); }
@Test public void testStreamEnd() { FakeStream stream = new FakeStream(); JsonParser parser = JsonParser.newParser(stream); List<JsonEvent> events = new ArrayList<>(); parser.handler(events::add); AtomicInteger ended = new AtomicInteger(); parser.endHandler(v -> ended.incrementAndGet()); stream.end(); assertEquals(0, events.size()); assertEquals(1, ended.get()); //regression check for #2790 - ensure that by accident resume method is not called. assertEquals(0, stream.pauseCount()); assertEquals(0, stream.resumeCount()); }
@Test public void testStreamPause() { FakeStream stream = new FakeStream(); JsonParser parser = JsonParser.newParser(stream); List<JsonEvent> events = new ArrayList<>(); parser.handler(events::add); parser.pause(); stream.handle("1234"); assertTrue(stream.isPaused()); assertEquals(0, events.size()); }
@Test public void testStreamPausedEnd() { FakeStream stream = new FakeStream(); JsonParser parser = JsonParser.newParser(stream); List<JsonEvent> events = new ArrayList<>(); parser.handler(events::add); AtomicInteger ended = new AtomicInteger(); parser.endHandler(v -> ended.incrementAndGet()); parser.pause(); stream.handle("{}"); stream.end(); assertEquals(0, ended.get()); assertEquals(0, events.size()); parser.fetch(1); assertEquals(1, events.size()); assertEquals(0, ended.get()); parser.fetch(1); assertEquals(2, events.size()); assertEquals(1, ended.get()); } }
@Test public void testStreamResume() { FakeStream stream = new FakeStream(); JsonParser parser = JsonParser.newParser(stream); List<JsonEvent> events = new ArrayList<>(); parser.handler(events::add); parser.pause(); stream.handle("{}"); parser.resume(); assertEquals(2, events.size()); assertFalse(stream.isPaused()); }
@Test public void testStreamFetch() { FakeStream stream = new FakeStream(); JsonParser parser = JsonParser.newParser(stream); List<JsonEvent> events = new ArrayList<>(); parser.handler(events::add); parser.pause(); stream.handle("{}"); parser.fetch(1); assertEquals(1, events.size()); assertTrue(stream.isPaused()); }
@Test public void testStreamFetchInHandler() { FakeStream stream = new FakeStream(); JsonParser parser = JsonParser.newParser(stream); List<JsonEvent> events = new ArrayList<>(); parser.handler(event -> { events.add(event); stream.fetch(1); }); stream.pause(); stream.fetch(1); stream.handle("{}"); assertEquals(2, events.size()); assertFalse(stream.isPaused()); }
@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()); }
@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()); }