@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);
  }
Esempio n. 8
0
    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);
    }