Search in sources :

Example 6 with PUnion

use of net.morimekta.providence.PUnion in project providence by morimekta.

the class PrettySerializer method appendMessage.

private void appendMessage(IndentedPrintWriter builder, PMessage<?, ?> message, boolean encloseParams) {
    PMessageDescriptor<?, ?> type = message.descriptor();
    boolean empty = true;
    if (encloseParams) {
        builder.append(Token.kParamsStart);
    } else {
        builder.append(Token.kMessageStart);
    }
    builder.begin();
    if (message instanceof PUnion) {
        if (((PUnion) message).unionFieldIsSet()) {
            PField field = ((PUnion) message).unionField();
            Object o = message.get(field.getId());
            builder.appendln().append(field.getName()).append(space).append(Token.kFieldValueSep).append(space);
            appendTypedValue(builder, field.getDescriptor(), o);
            empty = false;
        }
    } else {
        boolean first = true;
        for (PField field : type.getFields()) {
            if (message.has(field.getId())) {
                if (first) {
                    first = false;
                } else {
                    builder.append(entrySep);
                }
                Object o = message.get(field.getId());
                builder.appendln().append(field.getName()).append(space).append(Token.kFieldValueSep).append(space);
                appendTypedValue(builder, field.getDescriptor(), o);
                empty = false;
            }
        }
    }
    builder.end();
    if (!empty) {
        builder.appendln();
    }
    if (encloseParams) {
        builder.append(Token.kParamsEnd);
    } else {
        builder.append(Token.kMessageEnd);
    }
}
Also used : PField(net.morimekta.providence.descriptor.PField) PUnion(net.morimekta.providence.PUnion)

Example 7 with PUnion

use of net.morimekta.providence.PUnion in project providence by morimekta.

the class BinaryFormatUtils method writeMessage.

// --- WRITE METHODS ---
/**
 * Write message to writer.
 *
 * @param writer The binary writer.
 * @param message The message to write.
 * @param <Message> The message type.
 * @param <Field> The field type.
 * @return The number of bytes written.
 * @throws IOException If write failed.
 */
public static <Message extends PMessage<Message, Field>, Field extends PField> int writeMessage(BigEndianBinaryWriter writer, Message message) throws IOException {
    if (message instanceof BinaryWriter) {
        return ((BinaryWriter) message).writeBinary(writer);
    }
    int len = 0;
    if (message instanceof PUnion) {
        if (((PUnion) message).unionFieldIsSet()) {
            PField field = ((PUnion) message).unionField();
            len += writeFieldSpec(writer, forType(field.getDescriptor().getType()), field.getId());
            len += writeFieldValue(writer, message.get(field.getId()), field.getDescriptor());
        }
    } else {
        for (PField field : message.descriptor().getFields()) {
            if (message.has(field.getId())) {
                len += writeFieldSpec(writer, forType(field.getDescriptor().getType()), field.getId());
                len += writeFieldValue(writer, message.get(field.getId()), field.getDescriptor());
            }
        }
    }
    len += writer.writeUInt8(BinaryType.STOP);
    return len;
}
Also used : PField(net.morimekta.providence.descriptor.PField) BigEndianBinaryWriter(net.morimekta.util.io.BigEndianBinaryWriter) PUnion(net.morimekta.providence.PUnion)

Example 8 with PUnion

use of net.morimekta.providence.PUnion in project providence by morimekta.

the class TProtocolSerializerTest method assertConsistent.

@SuppressWarnings("unchecked")
public <Providence extends PMessage<Providence, ProvidenceField>, ProvidenceField extends PField, Thrift extends TBase<Thrift, ThriftField>, ThriftField extends TFieldIdEnum> void assertConsistent(String prefix, Providence providence, Thrift thrift) {
    if (providence.descriptor().getVariant() == PMessageVariant.UNION) {
        TUnion<?, ThriftField> t_union = (TUnion) thrift;
        PUnion<?, ProvidenceField> p_union = (PUnion) providence;
        ThriftField t_field = t_union.getSetField();
        PField p_field = p_union.unionField();
        assertEquals(p_field.getId(), t_field.getThriftFieldId());
    } else {
        for (PField field : providence.descriptor().getFields()) {
            ThriftField thriftField = thrift.fieldForId(field.getId());
            String fieldPath = (prefix.isEmpty() ? "" : prefix + ".") + field.getName();
            assertEquals("has " + fieldPath, providence.has(field.getId()), thrift.isSet(thriftField));
            if (providence.has(field.getId())) {
                switch(field.getType()) {
                    case MESSAGE:
                        assertConsistent(fieldPath, (PMessage) providence.get(field.getId()), (TBase) thrift.getFieldValue(thriftField));
                        break;
                    case ENUM:
                        {
                            PEnumValue<?> pe = providence.get(field.getId());
                            TEnum te = (TEnum) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath, pe.asInteger(), te.getValue());
                            break;
                        }
                    case BINARY:
                        {
                            Binary pBin = providence.get(field.getId());
                            byte[] tBytes = (byte[]) thrift.getFieldValue(thriftField);
                            Binary tBin = Binary.wrap(tBytes);
                            assertEquals(fieldPath, pBin, tBin);
                            break;
                        }
                    case MAP:
                        {
                            Map pm = providence.get(field.getId());
                            Map tm = (Map) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath + " size", pm.size(), tm.size());
                            // TODO: Compare actual content.
                            break;
                        }
                    case SET:
                        {
                            Set ps = providence.get(field.getId());
                            Set ts = (Set) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath + " size", ps.size(), ts.size());
                            // TODO: Compare actual content.
                            break;
                        }
                    case LIST:
                        {
                            List pl = providence.get(field.getId());
                            List tl = (List) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath + " size", pl.size(), tl.size());
                            for (int i = 0; i < pl.size(); ++i) {
                                String itemPath = fieldPath + "[" + i + "]";
                                Object pi = pl.get(i);
                                Object ti = tl.get(i);
                                if (pi instanceof PMessage) {
                                    assertConsistent(itemPath, (PMessage) pi, (TBase) ti);
                                } else if (pi instanceof Set) {
                                // TODO: Compare actual content.
                                } else if (pi instanceof List) {
                                // TODO: Compare actual content.
                                } else if (pi instanceof Map) {
                                // TODO: Compare actual content.
                                } else if (pi instanceof Binary) {
                                    Binary pb = (Binary) pi;
                                    Binary tb = Binary.wrap(((ByteBuffer) ti).array());
                                    assertEquals(itemPath, pb, tb);
                                } else if (pi instanceof PEnumValue) {
                                    PEnumValue pe = (PEnumValue) pi;
                                    TEnum te = (TEnum) ti;
                                    assertEquals(itemPath, pe.asInteger(), te.getValue());
                                } else {
                                    assertEquals(itemPath, pi, ti);
                                }
                            }
                            break;
                        }
                    default:
                        assertEquals(fieldPath, providence.get(field.getId()), thrift.getFieldValue(thriftField));
                        break;
                }
            }
        }
    }
}
Also used : TUnion(org.apache.thrift.TUnion) Set(java.util.Set) PField(net.morimekta.providence.descriptor.PField) PEnumValue(net.morimekta.providence.PEnumValue) ByteBuffer(java.nio.ByteBuffer) TEnum(org.apache.thrift.TEnum) PMessage(net.morimekta.providence.PMessage) PUnion(net.morimekta.providence.PUnion) ArrayList(java.util.ArrayList) List(java.util.List) TBase(org.apache.thrift.TBase) Binary(net.morimekta.util.Binary) Map(java.util.Map)

Example 9 with PUnion

use of net.morimekta.providence.PUnion in project providence by morimekta.

the class EqualToMessage method collectMismatches.

private static <T extends PMessage<T, F>, F extends PField> void collectMismatches(String xPath, T expected, T actual, ArrayList<String> mismatches) {
    // mismatch / test failure, it should be fine.
    if (expected.descriptor().getVariant() == PMessageVariant.UNION) {
        PUnion<?, ?> eu = (PUnion) expected;
        PUnion<?, ?> ac = (PUnion) actual;
        if (!eu.unionField().equals(ac.unionField())) {
            mismatches.add(String.format(Locale.US, "%s to have %s, but had %s", xPath, eu.unionField().getName(), ac.unionField().getName()));
        }
    }
    for (PField field : expected.descriptor().getFields()) {
        int key = field.getId();
        String fieldXPath = xPath.isEmpty() ? field.getName() : xPath + "." + field.getName();
        if (expected.has(key) != actual.has(key)) {
            if (!expected.has(key)) {
                mismatches.add(String.format(Locale.US, "%s to be missing, but was %s", fieldXPath, toString(actual.get(field.getId()))));
            } else if (!actual.has(key)) {
                mismatches.add(String.format(Locale.US, "%s to be %s, but was missing", fieldXPath, toString(expected.get(field.getId()))));
            }
        } else if (!Objects.equals(expected.get(key), actual.get(key))) {
            switch(field.getType()) {
                case MESSAGE:
                    {
                        collectMismatches(fieldXPath, expected.get(key), actual.get(key), mismatches);
                        break;
                    }
                case LIST:
                    {
                        collectListMismatches(fieldXPath, expected.get(key), actual.get(key), mismatches);
                        break;
                    }
                case SET:
                    {
                        collectSetMismatches(fieldXPath, expected.get(key), actual.get(key), mismatches);
                        break;
                    }
                case MAP:
                    {
                        collectMapMismatches(fieldXPath, expected.get(key), actual.get(key), mismatches);
                        break;
                    }
                default:
                    {
                        mismatches.add(String.format(Locale.US, "%s was %s, expected %s", fieldXPath, toString(actual.get(field.getId())), toString(expected.get(field.getId()))));
                        break;
                    }
            }
        }
    }
}
Also used : PField(net.morimekta.providence.descriptor.PField) PUnion(net.morimekta.providence.PUnion)

Aggregations

PUnion (net.morimekta.providence.PUnion)9 PField (net.morimekta.providence.descriptor.PField)9 ByteBuffer (java.nio.ByteBuffer)1 ArrayList (java.util.ArrayList)1 BitSet (java.util.BitSet)1 List (java.util.List)1 Map (java.util.Map)1 Set (java.util.Set)1 PEnumValue (net.morimekta.providence.PEnumValue)1 PMessage (net.morimekta.providence.PMessage)1 SerializerException (net.morimekta.providence.serializer.SerializerException)1 Binary (net.morimekta.util.Binary)1 BigEndianBinaryWriter (net.morimekta.util.io.BigEndianBinaryWriter)1 TBase (org.apache.thrift.TBase)1 TEnum (org.apache.thrift.TEnum)1 TUnion (org.apache.thrift.TUnion)1