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);
}
}
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;
}
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;
}
}
}
}
}
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;
}
}
}
}
}
Aggregations