/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.isis.viewer.restfulobjects.rendering.domainobjects; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; import java.util.Date; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.integration.junit4.JMock; import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.apache.isis.core.metamodel.adapter.ObjectAdapter; import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager; import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet; import org.apache.isis.core.metamodel.spec.ObjectSpecId; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; @RunWith(JMock.class) public class JsonValueEncoderTest_appendValueAndFormat { private final Mockery context = new JUnit4Mockery(); private JsonRepresentation representation; private ObjectSpecification mockObjectSpec; private EncodableFacet mockEncodableFacet; private ObjectAdapter mockObjectAdapter; private AdapterManager mockAdapterManager; @Before public void setUp() throws Exception { mockObjectSpec = context.mock(ObjectSpecification.class); mockEncodableFacet = context.mock(EncodableFacet.class); mockObjectAdapter = context.mock(ObjectAdapter.class); mockAdapterManager = context.mock(AdapterManager.class); JsonValueEncoder.testSetAdapterManager(mockAdapterManager); representation = JsonRepresentation.newMap(); } @After public void tearDown() throws Exception { JsonValueEncoder.testSetAdapterManager(null); } @Test public void whenString() throws Exception { allowingObjectSpecToReturnSpecIdFor(String.class); allowingObjectAdapterToReturn("aString"); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isString("value"), is(true)); assertThat(representation.getString("value"), is("aString")); assertThat(representation.getString("format"), is(nullValue())); assertThat(representation.getString("extensions.x-isis-format"), is("string")); } @Test public void whenBooleanWrapper() throws Exception { allowingObjectSpecToReturnSpecIdFor(Boolean.class); allowingObjectAdapterToReturn(Boolean.TRUE); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isBoolean("value"), is(true)); assertThat(representation.getBoolean("value"), is(Boolean.TRUE)); assertThat(representation.getString("format"), is(nullValue())); } @Test public void whenBooleanPrimitive() throws Exception { allowingObjectSpecToReturnSpecIdFor(boolean.class); allowingObjectAdapterToReturn(true); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isBoolean("value"), is(true)); assertThat(representation.getBoolean("value"), is(true)); assertThat(representation.getString("format"), is(nullValue())); } @Test public void whenByteWrapper() throws Exception { allowingObjectSpecToReturnSpecIdFor(Byte.class); allowingObjectAdapterToReturn(Byte.valueOf((byte)123)); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isIntegralNumber("value"), is(true)); assertThat(representation.getByte("value"), is(Byte.valueOf((byte)123))); assertThat(representation.getString("format"), is("int")); assertThat(representation.getString("extensions.x-isis-format"), is("byte")); } @Test public void whenBytePrimitive() throws Exception { allowingObjectSpecToReturnSpecIdFor(byte.class); allowingObjectAdapterToReturn((byte)123); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isIntegralNumber("value"), is(true)); assertThat(representation.getByte("value"), is((byte)123)); assertThat(representation.getString("format"), is("int")); assertThat(representation.getString("extensions.x-isis-format"), is("byte")); } @Test public void whenShortWrapper() throws Exception { allowingObjectSpecToReturnSpecIdFor(Short.class); allowingObjectAdapterToReturn(Short.valueOf((short)12345)); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isIntegralNumber("value"), is(true)); assertThat(representation.getShort("value"), is(Short.valueOf((short)12345))); assertThat(representation.getString("format"), is("int")); assertThat(representation.getString("extensions.x-isis-format"), is("short")); } @Test public void whenShortPrimitive() throws Exception { allowingObjectSpecToReturnSpecIdFor(short.class); allowingObjectAdapterToReturn((short)12345); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isIntegralNumber("value"), is(true)); assertThat(representation.getShort("value"), is((short)12345)); assertThat(representation.getString("format"), is("int")); assertThat(representation.getString("extensions.x-isis-format"), is("short")); } @Test public void whenIntWrapper() throws Exception { allowingObjectSpecToReturnSpecIdFor(Integer.class); allowingObjectAdapterToReturn(Integer.valueOf(12345678)); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isIntegralNumber("value"), is(true)); assertThat(representation.getInt("value"), is(Integer.valueOf(12345678))); assertThat(representation.getString("format"), is("int")); assertThat(representation.getString("extensions.x-isis-format"), is("int")); } @Test public void whenIntPrimitive() throws Exception { allowingObjectSpecToReturnSpecIdFor(int.class); allowingObjectAdapterToReturn(12345678); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isIntegralNumber("value"), is(true)); assertThat(representation.getInt("value"), is(12345678)); assertThat(representation.getString("format"), is("int")); assertThat(representation.getString("extensions.x-isis-format"), is("int")); } @Test public void whenLongWrapper() throws Exception { allowingObjectSpecToReturnSpecIdFor(Long.class); allowingObjectAdapterToReturn(Long.valueOf(12345678901234L)); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isIntegralNumber("value"), is(true)); assertThat(representation.getLong("value"), is(Long.valueOf(12345678901234L))); assertThat(representation.getString("format"), is("int")); assertThat(representation.getString("extensions.x-isis-format"), is("long")); } @Test public void whenLongPrimitive() throws Exception { allowingObjectSpecToReturnSpecIdFor(long.class); allowingObjectAdapterToReturn(12345678901234L); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isIntegralNumber("value"), is(true)); assertThat(representation.getLong("value"), is(12345678901234L)); assertThat(representation.getString("format"), is("int")); assertThat(representation.getString("extensions.x-isis-format"), is("long")); } @Test public void whenFloatWrapper() throws Exception { allowingObjectSpecToReturnSpecIdFor(Float.class); allowingObjectAdapterToReturn(Float.valueOf((float)123.45)); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isDecimal("value"), is(true)); assertThat(representation.getFloat("value"), is(Float.valueOf((float)123.45))); assertThat(representation.getString("format"), is("decimal")); assertThat(representation.getString("extensions.x-isis-format"), is("float")); } @Test public void whenFloatPrimitive() throws Exception { allowingObjectSpecToReturnSpecIdFor(Float.class); allowingObjectAdapterToReturn((float)123.45); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isDecimal("value"), is(true)); assertThat(representation.getFloat("value"), is((float)123.45)); assertThat(representation.getString("format"), is("decimal")); assertThat(representation.getString("extensions.x-isis-format"), is("float")); } @Test public void whenDoubleWrapper() throws Exception { allowingObjectSpecToReturnSpecIdFor(Double.class); allowingObjectAdapterToReturn(Double.valueOf(12345.6789)); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isDecimal("value"), is(true)); assertThat(representation.getDouble("value"), is(Double.valueOf(12345.6789))); assertThat(representation.getString("format"), is("decimal")); assertThat(representation.getString("extensions.x-isis-format"), is("double")); } @Test public void whenDoublePrimitive() throws Exception { allowingObjectSpecToReturnSpecIdFor(double.class); allowingObjectAdapterToReturn(12345.6789); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isDecimal("value"), is(true)); assertThat(representation.getDouble("value"), is(12345.6789)); assertThat(representation.getString("format"), is("decimal")); assertThat(representation.getString("extensions.x-isis-format"), is("double")); } @Test public void whenCharWrapper() throws Exception { allowingObjectSpecToReturnSpecIdFor(Character.class); allowingObjectAdapterToReturn(Character.valueOf('a')); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isString("value"), is(true)); assertThat(representation.getChar("value"), is(Character.valueOf('a'))); assertThat(representation.getString("format"), is(nullValue())); assertThat(representation.getString("extensions.x-isis-format"), is("char")); } @Test public void whenCharPrimitive() throws Exception { allowingObjectSpecToReturnSpecIdFor(char.class); allowingObjectAdapterToReturn('a'); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isString("value"), is(true)); assertThat(representation.getChar("value"), is('a')); assertThat(representation.getString("format"), is(nullValue())); assertThat(representation.getString("extensions.x-isis-format"), is("char")); } @Test public void whenJavaUtilDate() throws Exception { allowingObjectSpecToReturnSpecIdFor(java.util.Date.class); allowingObjectAdapterToReturn(asDateTime("2014-04-25T12:34:45Z")); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isString("value"), is(true)); assertThat(representation.getString("value"), is("2014-04-25T12:34:45Z")); assertThat(representation.getString("format"), is("date-time")); assertThat(representation.getString("extensions.x-isis-format"), is("javautildate")); } @Test public void whenJavaSqlDate() throws Exception { allowingObjectSpecToReturnSpecIdFor(java.sql.Date.class); allowingObjectAdapterToReturn(asSqlDate("2014-04-25")); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isString("value"), is(true)); assertThat(representation.getString("value"), is("2014-04-25")); assertThat(representation.getString("format"), is("date")); assertThat(representation.getString("extensions.x-isis-format"), is("javasqldate")); } @Test public void whenJodaDateTime() throws Exception { allowingObjectSpecToReturnSpecIdFor(org.joda.time.DateTime.class); allowingObjectAdapterToReturn(new org.joda.time.DateTime(asDateTime("2014-04-25T12:34:45Z"))); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isString("value"), is(true)); assertThat(representation.getString("value"), is("2014-04-25T12:34:45Z")); assertThat(representation.getString("format"), is("date-time")); assertThat(representation.getString("extensions.x-isis-format"), is("jodadatetime")); } @Test public void whenJodaLocalDateTime() throws Exception { allowingObjectSpecToReturnSpecIdFor(org.joda.time.LocalDateTime.class); allowingObjectAdapterToReturn(new org.joda.time.LocalDateTime(asDateTime("2014-04-25T12:34:45Z"))); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isString("value"), is(true)); assertThat(representation.getString("value"), is("2014-04-25T12:34:45Z")); assertThat(representation.getString("format"), is("date-time")); assertThat(representation.getString("extensions.x-isis-format"), is("jodalocaldatetime")); } @Test public void whenJodaLocalDate() throws Exception { allowingObjectSpecToReturnSpecIdFor(org.joda.time.LocalDate.class); allowingObjectAdapterToReturn(new org.joda.time.LocalDate(2014,4,25)); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isString("value"), is(true)); assertThat(representation.getString("value"), is("2014-04-25")); assertThat(representation.getString("format"), is("date")); assertThat(representation.getString("extensions.x-isis-format"), is("jodalocaldate")); } @Test public void whenJavaSqlTimestamp() throws Exception { allowingObjectSpecToReturnSpecIdFor(java.sql.Timestamp.class); final long time = asDateTime("2014-04-25T12:34:45Z").getTime(); allowingObjectAdapterToReturn(new Timestamp(time)); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, null, false); assertThat(representation.isLong("value"), is(true)); assertThat(representation.getLong("value"), is(time)); assertThat(representation.getString("format"), is("utc-millisec")); assertThat(representation.getString("extensions.x-isis-format"), is("javasqltimestamp")); } @Test public void whenBigInteger() throws Exception { allowingObjectSpecToReturnSpecIdFor(BigInteger.class); allowingObjectAdapterToReturn(new BigInteger("12345678901234567890")); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, "big-integer(22)", false); assertThat(representation.isString("value"), is(true)); assertThat(representation.isBigInteger("value"), is(true)); assertThat(representation.getBigInteger("value"), is(new BigInteger("12345678901234567890"))); assertThat(representation.getString("format"), is("big-integer(22)")); assertThat(representation.getString("extensions.x-isis-format"), is("javamathbiginteger")); } @Test public void whenBigDecimal() throws Exception { allowingObjectSpecToReturnSpecIdFor(BigDecimal.class); allowingObjectAdapterToReturn(new BigDecimal("12345678901234567890.1234")); JsonValueEncoder.appendValueAndFormat(mockObjectSpec, mockObjectAdapter, representation, "big-decimal(27,4)", false); assertThat(representation.isString("value"), is(true)); assertThat(representation.isBigDecimal("value"), is(true)); assertThat(representation.getBigDecimal("value"), is(new BigDecimal("12345678901234567890.1234"))); assertThat(representation.getString("format"), is("big-decimal(27,4)")); assertThat(representation.getString("extensions.x-isis-format"), is("javamathbigdecimal")); } private void allowingObjectSpecToReturnSpecIdFor(final Class<?> cls) { context.checking(new Expectations() { { oneOf(mockObjectSpec).getSpecId(); will(returnValue(new ObjectSpecId(cls.getName()))); } }); } private void allowingObjectAdapterToReturn(final Object pojo) { context.checking(new Expectations() { { oneOf(mockObjectAdapter).getObject(); will(returnValue(pojo)); } }); } private static java.sql.Date asSqlDate(final String text) { return new java.sql.Date(JsonRepresentation.yyyyMMdd.parseDateTime(text).getMillis()); } private static Date asDateTime(final String text) { return new java.util.Date(JsonRepresentation.yyyyMMddTHHmmssZ.parseDateTime(text).getMillis()); } }