@Test public void basic() throws Throwable { // @formatter:off String json = "[\"vcard\"," + "[" + "[\"prop1\", {}, \"text\", \"one\"]," + "[\"prop2\", {}, \"integer\", 2]" + "]" + "]"; // @formatter:on JCardRawReader reader = createReader(json); JCardDataStreamListener listener = mock(JCardDataStreamListener.class); reader.readNext(listener); verify(listener).beginVCard(); verify(listener) .readProperty( null, "prop1", new VCardParameters(), VCardDataType.TEXT, JCardValue.single("one")); verify(listener) .readProperty( null, "prop2", new VCardParameters(), VCardDataType.INTEGER, JCardValue.single(2L)); verifyNoMoreInteractions(listener); }
@Test public void multi_value() throws Throwable { // @formatter:off String json = "[\"vcard\"," + "[" + "[\"prop\", {}, \"text\", \"one\", \"two\", \"three\" ]," + "[\"prop\", {}, \"text\", \"one\" ]" + "]" + "]"; // @formatter:on JCardRawReader reader = createReader(json); JCardDataStreamListener listener = mock(JCardDataStreamListener.class); reader.readNext(listener); verify(listener).beginVCard(); verify(listener) .readProperty( null, "prop", new VCardParameters(), VCardDataType.TEXT, JCardValue.multi("one", "two", "three")); verify(listener) .readProperty( null, "prop", new VCardParameters(), VCardDataType.TEXT, JCardValue.multi("one")); verifyNoMoreInteractions(listener); }
@Test public void parameters() throws Throwable { // @formatter:off String json = "[\"vcard\"," + "[" + "[\"prop\", { \"a\": \"one\", \"b\": [\"two\"], \"c\": [\"three\", \"four\"] }, \"text\", \"value\"]" + "]" + "]"; // @formatter:on JCardRawReader reader = createReader(json); JCardDataStreamListener listener = mock(JCardDataStreamListener.class); reader.readNext(listener); VCardParameters expected = new VCardParameters(); expected.put("a", "one"); expected.put("b", "two"); expected.put("c", "three"); expected.put("c", "four"); verify(listener).beginVCard(); verify(listener) .readProperty(null, "prop", expected, VCardDataType.TEXT, JCardValue.single("value")); verifyNoMoreInteractions(listener); }
@Test public void different_data_types() throws Throwable { // @formatter:off String json = "[\"vcard\"," + "[" + "[\"prop\", {}, \"text\", false, true, 1.1, 1, null, \"text\" ]" + "]" + "]"; // @formatter:on JCardRawReader reader = createReader(json); JCardDataStreamListener listener = mock(JCardDataStreamListener.class); reader.readNext(listener); verify(listener).beginVCard(); verify(listener) .readProperty( null, "prop", new VCardParameters(), VCardDataType.TEXT, JCardValue.multi(false, true, 1.1, 1L, null, "text")); verifyNoMoreInteractions(listener); }
@Test public void ignore_other_json() throws Throwable { // @formatter:off String json = "{" + "\"website\": \"example.com\"," + "\"vcard\":" + "[\"vcard\"," + "[" + "[\"prop\", {}, \"text\", \"value\"]" + "]," + "[" + "]" + "]" + "}"; // @formatter:on JCardRawReader reader = createReader(json); JCardDataStreamListener listener = mock(JCardDataStreamListener.class); reader.readNext(listener); verify(listener).beginVCard(); verify(listener) .readProperty( null, "prop", new VCardParameters(), VCardDataType.TEXT, JCardValue.single("value")); verifyNoMoreInteractions(listener); }
@Test public void bad_snytax() throws Throwable { // @formatter:off String json = "[" + "[\"vcard\"," + "[" + "[\"prop1\", {}, \"text\", \"one\"]," + "[\"prop2\", {}, []]" + "]" + "]," + "[\"vcard\"," + "[" + "[\"prop1\", {}, \"text\", \"one\"]," + "[\"prop2\", {}, \"integer\", 2]" + "]" + "]" + "]"; // @formatter:on JCardRawReader reader = createReader(json); JCardDataStreamListener listener = mock(JCardDataStreamListener.class); try { reader.readNext(listener); fail("JCardParseException expected."); } catch (JCardParseException e) { assertEquals(JsonToken.VALUE_STRING, e.getExpectedToken()); assertEquals(JsonToken.START_ARRAY, e.getActualToken()); } reader.readNext(listener); verify(listener, times(2)).beginVCard(); verify(listener, times(2)) .readProperty( null, "prop1", new VCardParameters(), VCardDataType.TEXT, JCardValue.single("one")); verify(listener) .readProperty( null, "prop2", new VCardParameters(), VCardDataType.INTEGER, JCardValue.single(2L)); verifyNoMoreInteractions(listener); }
@Test public void data_type_unknown() throws Throwable { // @formatter:off String json = "[\"vcard\"," + "[" + "[\"prop\", {}, \"unknown\", \"value\"]" + "]" + "]"; // @formatter:on JCardRawReader reader = createReader(json); JCardDataStreamListener listener = mock(JCardDataStreamListener.class); reader.readNext(listener); verify(listener).beginVCard(); verify(listener) .readProperty(null, "prop", new VCardParameters(), null, JCardValue.single("value")); verifyNoMoreInteractions(listener); }
public void readProperty( String group, String propertyName, VCardParameters parameters, VCardDataType dataType, JCardValue value) { if ("version".equalsIgnoreCase(propertyName)) { // don't unmarshal "version" because we don't treat it as a property versionFound = true; VCardVersion version = VCardVersion.valueOfByStr(value.asSingle()); if (version != VCardVersion.V4_0) { warnings.add(reader.getLineNum(), propertyName, 30); } return; } VCardPropertyScribe<? extends VCardProperty> scribe = index.getPropertyScribe(propertyName); if (scribe == null) { scribe = new RawPropertyScribe(propertyName); } Result<? extends VCardProperty> result; try { result = scribe.parseJson(value, dataType, parameters); for (String warning : result.getWarnings()) { warnings.add(reader.getLineNum(), warning, propertyName); } } catch (SkipMeException e) { warnings.add(reader.getLineNum(), propertyName, 22, e.getMessage()); return; } catch (CannotParseException e) { scribe = new RawPropertyScribe(propertyName); result = scribe.parseJson(value, dataType, parameters); VCardProperty property = result.getProperty(); String valueStr = ((RawProperty) property).getValue(); warnings.add(reader.getLineNum(), propertyName, 25, valueStr, e.getMessage()); } catch (EmbeddedVCardException e) { warnings.add(reader.getLineNum(), propertyName, 31); return; } VCardProperty property = result.getProperty(); property.setGroup(group); vcard.addProperty(property); }