package com.github.nkzawa.socketio.parser;
import com.github.nkzawa.emitter.Emitter;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.skyscreamer.jsonassert.JSONAssert;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class Helpers {
private static Parser.Encoder encoder = new Parser.Encoder();
private static Packet<String> errorPacket = new Packet<String>(Parser.ERROR, "parser error");
public static void test(final Packet obj) {
encoder.encode(obj, new Parser.Encoder.Callback() {
@Override
public void call(Object[] encodedPackets) {
Parser.Decoder decoder = new Parser.Decoder();
decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() {
@Override
public void call(Object... args) {
Packet packet = (Packet)args[0];
assertPacket(packet, obj);
}
});
decoder.add((String)encodedPackets[0]);
}
});
}
public static void testDecodeError(final String errorMessage) {
Parser.Decoder decoder = new Parser.Decoder();
decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() {
@Override
public void call(Object... args) {
Packet packet = (Packet)args[0];
assertPacket(errorPacket, packet);
}
});
decoder.add(errorMessage);
}
public static void testBin(final Packet obj) {
final Object originalData = obj.data;
encoder.encode(obj, new Parser.Encoder.Callback() {
@Override
public void call(Object[] encodedPackets) {
Parser.Decoder decoder = new Parser.Decoder();
decoder.on(Parser.Decoder.EVENT_DECODED, new Emitter.Listener() {
@Override
public void call(Object... args) {
Packet packet = (Packet)args[0];
obj.data = originalData;
obj.attachments = -1;
assertPacket(packet, obj);
}
});
for (Object packet : encodedPackets) {
if (packet instanceof String) {
decoder.add((String)packet);
} else if (packet instanceof byte[]) {
decoder.add((byte[])packet);
}
}
}
});
}
public static void assertPacket(Packet expected, Packet actual) {
assertThat(actual.type, is(expected.type));
assertThat(actual.id, is(expected.id));
assertThat(actual.nsp, is(expected.nsp));
assertThat(actual.attachments, is(expected.attachments));
if (expected.data instanceof JSONArray) {
try {
JSONAssert.assertEquals((JSONArray)expected.data, (JSONArray)actual.data, true);
} catch (JSONException e) {
throw new AssertionError(e);
}
} else if (expected.data instanceof JSONObject) {
try {
JSONAssert.assertEquals((JSONObject)expected.data, (JSONObject)actual.data, true);
} catch (JSONException e) {
throw new AssertionError(e);
}
} else {
assertThat(actual.data, is(expected.data));
}
}
}