/** * Copyright 2007-2015, Kaazing Corporation. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kaazing.k3po.lang.internal.el; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import java.net.URI; import java.nio.ByteBuffer; import javax.el.ELException; import javax.el.ExpressionFactory; import javax.el.ValueExpression; import org.junit.Test; import de.odysseus.el.misc.TypeConverter; import de.odysseus.el.util.SimpleContext; public class TypeConverterImplTest { @Test public void shouldConvertStringToURI() throws Exception { TypeConverter converter = new TypeConverterImpl(); String location = "http://localhost:8001/path?query"; URI expected = URI.create(location); Object o = converter.convert(location, URI.class); assertThat(o, instanceOf(URI.class)); assertEquals(expected, o); } @Test(expected = ELException.class) public void shouldNotConvertToURI() throws Exception { TypeConverter converter = new TypeConverterImpl(); converter.convert(converter, URI.class); } @Test() public void shouldConvertByteArrayToByteArray() throws Exception { TypeConverter converter = new TypeConverterImpl(); byte[] byteArr = { 1, 2, 3, 4, 5, 6 }; Object o = converter.convert(byteArr, byte[].class); assertThat(o, instanceOf(byte[].class)); assertArrayEquals(byteArr, (byte[]) o); } @Test() public void shouldConvertLongToByteArray() throws Exception { TypeConverter converter = new TypeConverterImpl(); long l = 4096L; byte[] expected = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong(l).array(); Object o = converter.convert(l, byte[].class); assertThat(o, instanceOf(byte[].class)); assertArrayEquals(expected, (byte[]) o); Long lg = l; o = converter.convert(lg, byte[].class); assertArrayEquals(expected, (byte[]) o); } @Test() public void shouldConvertIntegerToByteArray() throws Exception { TypeConverter converter = new TypeConverterImpl(); int l = 4096; byte[] expected = ByteBuffer.allocate(Integer.SIZE / Byte.SIZE).putInt(l).array(); Object o = converter.convert(l, byte[].class); assertThat(o, instanceOf(byte[].class)); assertArrayEquals(expected, (byte[]) o); Integer lg = l; o = converter.convert(lg, byte[].class); assertArrayEquals(expected, (byte[]) o); } @Test() public void shouldConvertShortToByteArray() throws Exception { TypeConverter converter = new TypeConverterImpl(); short l = 4096; byte[] expected = ByteBuffer.allocate(Short.SIZE / Byte.SIZE).putShort(l).array(); Object o = converter.convert(l, byte[].class); assertThat(o, instanceOf(byte[].class)); assertArrayEquals(expected, (byte[]) o); Short lg = l; o = converter.convert(lg, byte[].class); assertArrayEquals(expected, (byte[]) o); } @Test() public void shouldConvertByteToByteArray() throws Exception { TypeConverter converter = new TypeConverterImpl(); byte l = 16; byte[] expected = ByteBuffer.allocate(Byte.SIZE / Byte.SIZE).put(l).array(); Object o = converter.convert(l, byte[].class); assertThat(o, instanceOf(byte[].class)); assertArrayEquals(expected, (byte[]) o); Byte lg = l; o = converter.convert(lg, byte[].class); assertArrayEquals(expected, (byte[]) o); } @Test() public void shouldConvertAnObjectToCompatibleObject() throws Exception { TypeConverter converter = new TypeConverterImpl(); Object o = converter.convert(converter, TypeConverter.class); assertThat(o, instanceOf(TypeConverter.class)); assertThat(o, instanceOf(TypeConverterImpl.class)); assertEquals(converter, o); } @Test(expected = ELException.class) public void shouldNotConvertToByteArray() throws Exception { TypeConverter converter = new TypeConverterImpl(); converter.convert(converter, byte[].class); } @Test() public void doByteArrayExpression() throws Exception { ExpressionFactory factory = ExpressionFactoryUtils.newExpressionFactory(); SimpleContext evalContext = new SimpleContext(); ValueExpression byteExpr = factory.createValueExpression(new SimpleContext(), "${bytes}", byte[].class); byte[] expected = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; evalContext.getELResolver().setValue(new SimpleContext(), null, "bytes", expected); byte[] result = (byte[]) byteExpr.getValue(evalContext); assertArrayEquals(expected, result); } @Test() public void doLongtoByteArrayExpression() throws Exception { ExpressionFactory factory = ExpressionFactoryUtils.newExpressionFactory(); SimpleContext evalContext = new SimpleContext(); ValueExpression byteExpr = factory.createValueExpression(new SimpleContext(), "${bytes}", byte[].class); long number = 4096L; evalContext.getELResolver().setValue(new SimpleContext(), null, "bytes", number); byte[] expected = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong(number).array(); byte[] result = (byte[]) byteExpr.getValue(evalContext); assertArrayEquals(expected, result); } @Test() public void shouldDoArithmeticExpression() throws Exception { ExpressionFactory factory = ExpressionFactoryUtils.newExpressionFactory(); SimpleContext evalContext = new SimpleContext(); ValueExpression byteExpr = factory.createValueExpression(new SimpleContext(), "${bytes-1}", byte[].class); short number = 4096; evalContext.getELResolver().setValue(new SimpleContext(), null, "bytes", number); // Note that the expression should result in a widening conversion. EL // specification Section 1.17 byte[] expected = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong(number - 1).array(); byte[] result = (byte[]) byteExpr.getValue(evalContext); assertArrayEquals(expected, result); } @Test(expected = ELException.class) public void doNotByteArrayExpression() throws Exception { ExpressionFactory factory = ExpressionFactoryUtils.newExpressionFactory(); SimpleContext evalContext = new SimpleContext(); ValueExpression byteExpr = factory.createValueExpression(new SimpleContext(), "${bytes-1}", byte[].class); byte[] in = { 1, 2, 3, 4 }; evalContext.getELResolver().setValue(new SimpleContext(), null, "bytes", in); byteExpr.getValue(evalContext); } }