/*******************************************************************************
* Copyright (c) 2008 Vlad Dumitrescu and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.util;
import static org.junit.Assert.assertTrue;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import org.erlide.util.erlang.IConvertible;
import org.erlide.util.erlang.Signature;
import org.erlide.util.erlang.SignatureException;
import org.erlide.util.erlang.TypeConverter;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.ericsson.otp.erlang.OtpErlangAtom;
import com.ericsson.otp.erlang.OtpErlangBinary;
import com.ericsson.otp.erlang.OtpErlangDouble;
import com.ericsson.otp.erlang.OtpErlangFloat;
import com.ericsson.otp.erlang.OtpErlangList;
import com.ericsson.otp.erlang.OtpErlangLong;
import com.ericsson.otp.erlang.OtpErlangMap;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangString;
public class TypeConverterTest {
private void test(final Object o, final String sig, final OtpErlangObject expect)
throws SignatureException {
final OtpErlangObject result = TypeConverter.java2erlang(o, sig);
assertTrue(expect.equals(result));
}
@Before
public void setUp() {
Signature.setUseCache(false);
}
@After
public void tearDown() {
Signature.setUseCache(true);
}
@SuppressWarnings("boxing")
@Test
public void cvtIntegerOk_1() throws SignatureException {
test(397, "i", new OtpErlangLong(397));
}
@SuppressWarnings("boxing")
@Test
public void cvtIntegerOk_2() throws SignatureException {
test(3, "x", new OtpErlangLong(3));
}
@Test
public void cvtIntegerOk_3() throws SignatureException {
final BigInteger bigInteger = new BigInteger("39799999999999999999999", 10);
test(bigInteger, "i", new OtpErlangLong(bigInteger));
}
@SuppressWarnings("boxing")
@Test(expected = SignatureException.class)
public void cvtIntegerFail_1() throws SignatureException {
test(3, "s", new OtpErlangLong(3));
}
@Test
public void cvtListOk_1() throws SignatureException {
test(new String[] { "a" }, "ls", new OtpErlangList(
new OtpErlangObject[] { new OtpErlangString("a") }));
}
@SuppressWarnings("boxing")
@Test
public void cvtListOk_2() throws SignatureException {
test(new Object[] { "a", 35 }, "lx", new OtpErlangList(new OtpErlangObject[] {
new OtpErlangString("a"), new OtpErlangLong(35) }));
}
@Test(expected = SignatureException.class)
public void cvtListFail_1() throws SignatureException {
test(new String[] { "a" }, "li", new OtpErlangList(
new OtpErlangObject[] { new OtpErlangString("a") }));
}
@SuppressWarnings("boxing")
@Test(expected = SignatureException.class)
public void cvtListFail_2() throws SignatureException {
test(new Object[] { "a", 35 }, "ls", new OtpErlangList(new OtpErlangObject[] {
new OtpErlangString("a"), new OtpErlangLong(35) }));
}
@Test
public void cvtStringOk_1() throws SignatureException {
test("astring", "a", new OtpErlangAtom("astring"));
}
@Test
public void cvtStringOk_2() throws SignatureException {
test("astring", "s", new OtpErlangString("astring"));
}
@Test
public void cvtStringOk_4() throws SignatureException {
test("", "s", new OtpErlangString(""));
}
@Test
public void cvtStringOk_3() throws SignatureException {
test("astring", "b", new OtpErlangBinary("astring".getBytes()));
}
@Test(expected = SignatureException.class)
public void cvtStringFail_1() throws SignatureException {
test("astring", "p", new OtpErlangString("astring"));
}
@SuppressWarnings("boxing")
@Test
public void cvtFloatOk_1() throws SignatureException {
test(3.14f, "d", new OtpErlangFloat(3.14f));
}
@SuppressWarnings("boxing")
@Test
public void cvtDoubleOk_1() throws SignatureException {
test(3.14d, "d", new OtpErlangDouble(3.14d));
}
@Test
public void cvtMapOk_1() throws SignatureException {
final HashMap<OtpErlangObject, OtpErlangObject> map = new HashMap<OtpErlangObject, OtpErlangObject>();
test(map, "m", new OtpErlangMap(new OtpErlangObject[0], new OtpErlangObject[0]));
}
@Test
public void cvtMapOk_2() throws SignatureException {
final HashMap<OtpErlangObject, OtpErlangObject> map = new HashMap<OtpErlangObject, OtpErlangObject>();
map.put(new OtpErlangAtom("foo"), new OtpErlangAtom("bar"));
test(map, "m", new OtpErlangMap(
new OtpErlangObject[] { new OtpErlangAtom("foo") },
new OtpErlangObject[] { new OtpErlangAtom("bar") }));
}
@Test
public void parseSignature_0() throws SignatureException {
final String sig = null;
final Signature[] result = Signature.parse(sig);
assertTrue(result == null);
}
@Test
public void parseSignature_1() throws SignatureException {
final String sig = "aslsilpfd";
final Signature[] result = Signature.parse(sig);
final String expect = "[a, s, l(s), i, l(p), f, d]";
Assert.assertEquals(expect, Arrays.toString(result));
}
@Test
public void parseSignature_2() throws SignatureException {
final String sig = "llxi";
final Signature[] result = Signature.parse(sig);
final String expect = "[l(l(x)), i]";
assertTrue(Arrays.toString(result).equals(expect));
}
@Test
public void parseSignature_3() throws SignatureException {
final String sig = "2axd";
final Signature[] result = Signature.parse(sig);
final String expect = "[t(a,x), d]";
assertTrue(Arrays.toString(result).equals(expect));
}
@Test
public void parseSignature_4() throws SignatureException {
final String sig = "l3axl2sad";
final Signature[] result = Signature.parse(sig);
final String expect = "[l(t(a,x,l(t(s,a)))), d]";
assertTrue(Arrays.toString(result).equals(expect));
}
@Test
public void parseSignature_5() throws SignatureException {
final String sig = "32sadax";
final Signature[] result = Signature.parse(sig);
final String expect = "[t(t(s,a),d,a), x]";
assertTrue(Arrays.toString(result).equals(expect));
}
@SuppressWarnings("boxing")
@Test
public void cvtBoolOk_1() throws SignatureException {
test(true, "o", new OtpErlangAtom("true"));
}
@SuppressWarnings("boxing")
@Test
public void cvtBoolOk_2() throws SignatureException {
test(false, "o", new OtpErlangAtom("false"));
}
@SuppressWarnings("boxing")
@Test(expected = SignatureException.class)
public void cvtBoolFail_1() throws SignatureException {
test(true, "i", new OtpErlangAtom("true"));
}
@Test
public void cvtConvertible_1() throws SignatureException {
final IConvertible x = new IConvertible() {
@Override
public OtpErlangObject toErlangObject() {
return new OtpErlangAtom("__kalle__");
}
};
test(x, "j", new OtpErlangAtom("__kalle__"));
}
static class Cvt {
public static String fromErlangObject(final OtpErlangObject obj) {
return "hej";
}
}
@Test
public void cvtConvertible_2() throws SignatureException {
final Object x = "hej";
final OtpErlangObject obj = new OtpErlangAtom("hej d�");
final Object y = TypeConverter.erlang2java(obj, Cvt.class);
assertTrue(x.equals(y));
}
}